1. 程式人生 > 其它 >LeetCode139 單詞拆分

LeetCode139 單詞拆分

題目

給你一個字串 s 和一個字串列表 wordDict 作為字典。請你判斷是否可以利用字典中出現的單詞拼接出 s 。

注意:不要求字典中出現的單詞全部都使用,並且字典中的單詞可以重複使用。

示例 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 <= s.length <= 300
1 <= wordDict.length <= 1000
1 <= wordDict[i].length <= 20
s 和 wordDict[i] 僅有小寫英文字母組成
wordDict 中的所有字串 互不相同

方法

動態規劃

dp[i]表示從0到i-1的字串是否能夠由字典的字元子串拼成,因此
dp[i] = dp[j]&&check(j,i-1),其中0<j<i,check(j,i-1)表示從j到i-1截出的字元子串是否在字典裡

  • 時間複雜度:O(n^2)
  • 空間複雜度:O(n)
class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        int length = s.length();
        Set<String> set = new HashSet(wordDict);
        boolean[] dp = new boolean[length+1];
        dp[0] = true;
        for(int i=1;i<=length;i++){
            for(int j=0;j<i;j++){
                if(dp[j]&&set.contains(s.substring(j,i))){
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[length];
    }
}