单词拆分——动态规划

99 阅读1分钟

image.png

代码:

  1. 哈希表存储字典中的单词
  2. dp表示当前长度的 s 是否可以被组成
  3. dp[0]初始化,长度为 0 当然可以被组成
  4. 第一层 for 从长度为 1 开始,由小问题一步一步推向大问题
  5. 第二层 for 想要判断当前长度是否符合要求,自然要从当前问题的子问题,也就是当前长度的分段,查找当前长度的分段是否符合要求
  6. dp[j] && wordDictSet[s[j:i]],即(0——j)和(j——i),前者可以直接用 dp 数组得到答案,因为这个子问题已经处理过了,如果符合条件则dp【i】为true,直接break就可以了
  7. 最后dp[len(s)],就是我们要的最终问题的答案
func wordBreak(s string, wordDict []string) bool {
    wordDictSet := make(map[string]bool)
    for _, w := range wordDict {
        wordDictSet[w] = true
    }
    dp := make([]bool, len(s) + 1)
    dp[0] = true
    for i := 1; i <= len(s); i++ {
        for j := 0; j < i; j++ {
            if dp[j] && wordDictSet[s[j:i]] {
                dp[i] = true
                break
            }
        }
    }
    return dp[len(s)]
}