力扣刷题139. 单词拆分

139. 单词拆分 - 力扣(LeetCode)

最开始是字符串从头开始遍历子字符串,遇到字典内有的单词则直接i+上这个单词的长度,最后看看是否整个字符串都能遍历完即可

但是这么简单显然是错误的,没有考虑到如下的情况: s ="goalspecial" wordDict =["go","goal","goals","special"] 当字符串中的一个子字符串包含有多个字典中的词,则需要考虑要使用哪个词了。 看了官方的题解后,使用dp[i]=true来表示s[i]之前的字符串可被字典完全替换。

以下是错误的代码

class Solution {
 public boolean wordBreak(String s, List wordDict) {
        int[] dp = new int[s.length()];
        int index = 0;int flag = 0;
        while (index < s.length()) {
            

            for (int j = 0; j < wordDict.size(); j++) {
                String s1 = wordDict.get(j);// leet
                int len = s1.length();// 4
                if (index + len > s.length()) {
                    // System.out.println(false);
                    flag = 0;
                    break;
                }
                if (s.substring(index, len + index).equals(s1)) {// true
                    flag = 1;

                    index += len;// 4 8
                    dp[index - 1] = 1;
                }
                if (dp[s.length() - 1] == 1) {
                    // System.out.println(true);
                    flag = 1;
                    break;
                }

            }
            if (flag == 0) {
                // System.out.println(false);
                flag = 0;
                break;
            }
        }
        if(flag == 0)return false;
        else return true;

    }
}

需要判断dp[j]的合法性才能继续遍历

class Solution {
 public boolean wordBreak(String s, List wordDict) {
        Set wordDictSet = new HashSet<>(wordDict);
        boolean[] dp = new boolean[s.length() + 1];
        dp[0] = true;

        for (int i = 1; i <= s.length(); i++) {
            for (int j = 0; j < i; j++) {
                if (dp[j] && wordDictSet.contains(s.substring(j, i))) {
                    dp[i] = true;
                    break;
                }
            }
        }
        //System.out.println(dp[s.length()]);
        return dp[s.length()];
    }
}

你可能感兴趣的:(leetcode,算法)