12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- package main
- func wordBreakOld(s string, wordDict []string) bool { // TLE :^<
- length := len(s)
- if length == 0 || len(wordDict) == 0 {
- return false
- }
- set := make(map[string]bool, 0)
- min, max := length, 0
- for _, v := range wordDict {
- vLen := len(v)
- if vLen < min {
- min = vLen
- }
- if vLen > max {
- max = vLen
- }
- set[v] = true
- }
- return breakHelper(s, &set, 0, length, min, max)
- }
- func breakHelper(s string, set *map[string]bool, beg, end, min, max int) bool {
- if beg == end {
- return true
- }
- i := beg + max
- if i > end {
- i = end
- }
- for ; i > beg; i-- {
- if (*set)[s[beg:i]] {
- if breakHelper(s, set, i, end, min, max) {
- return true
- }
- }
- }
- return false
- }
- func wordBreak(s string, wordDict []string) bool { // Faster DP solution
- length := len(s)
- result := make([]bool, length+1)
- result[0] = true
- set := make(map[string]bool, 0)
- for _, v := range wordDict {
- set[v] = true
- }
- for i := 1; i <= length; i++ {
- for j := 0; j < i; j++ {
- if result[j] && set[s[j:i]] {
- result[i] = true
- break
- }
- }
- }
- return result[length]
- }
- // func main() {
- // println(wordBreak(
- // "catsanddogsand",
- // []string{"cats", "and", "sand", "dogs", "dog"}))
- // }
|