139. 单词拆分
用set记录wordDict中单词出现情况
- 暴力不过,仔细分析发现其中确实存在重复的判断
func wordBreak(s string, wordDict []string) bool {
set := make(map[string]bool)
for i := 0; i < len(wordDict); i++ {
set[wordDict[i]] = true
}
return help(s, set, 0)
}
func help(s string, set map[string]bool, index int) bool {
if index == len(s) {
return true
}
for i := index + 1; i <= len(s); i++ {
if set[s[index:i]] {
if help(s, set, i) {
return true
}
}
}
return false
}
- 动态规划
明确dp数组的含义:
dp[i]表示s中前i个字符组成的序列是否可以由wordDict拼接成
确定递推公式:
若考察的序列就在set中,dp[i]= true;
否则,往前边找是否可以拼接成该序列
func wordBreak(s string, wordDict []string) bool {
set := make(map[string]bool)
for i := 0; i < len(wordDict); i++ {
set[wordDict[i]] = true
}
n := len(s)
dp := make([]bool, n)
for i := 0; i < n; i++ {
if set[s[:i+1]] {
dp[i] = true
} else {
for j := 0; j < i; j++ {
if dp[j] && set[s[j+1:i+1]] {
dp[i] = true
}
}
}
}
return dp[n-1]
}