LeetCode 139. Word Break(单词拆分)

示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。

示例 2:
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
     注意你可以重复使用字典中的单词。
     
示例 3:
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

  1. 可以重复使用字典中的单词——完全背包
  2. 涉及到字典中单词的使用顺序,也就是说物品必须按一定顺序放入背包中。
    求解顺序的完全背包问题时,对物品的迭代应该放在最里层对背包的迭代放在外层,只有这样才能让物品按一定顺序放入背包中。
public boolean wordBreak(String s, List<String> wordDict) {
        int n = s.length();

        boolean[] dp = new boolean[n + 1];//dp[i]表示:s 中以 i - 1 结尾的字符串是否可被 wordDict 拆分
        dp[0] = true;

        for(int i = 1; i <= n; i ++) {
            for(int j = 0; j < i; j ++) {
                if(dp[j] && wordDict.contains(s.substring(j, i))) {
                    dp[i] = true;
                    break;
                }
            }
        }

        return dp[n];
    }
原创文章 626 获赞 104 访问量 32万+

猜你喜欢

转载自blog.csdn.net/gx17864373822/article/details/105420716