1. 程式人生 > >LeetCode-【動態規劃】-單詞劃分

LeetCode-【動態規劃】-單詞劃分

給定一個非空字串 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

題解:動態規劃的思路。用dp[i]表示0到i的子字串是否可以拆分成滿足條件的單詞,如果以i為結尾的j~i子串是滿足條件的,並且0~j的子串也是在字典中的,那麼dp[i]就是true。就拿示例1來說,當i=3時,0~i的字串為"leet","leet"在字典中並且"leet"的前一個字串dp[0]也是true,這時dp[i+1](這裡讓dp[i+1]為ture是為了下一步判斷)修改為true,接著往後遍歷到i=7,這時4~i的字串為"code","code"在字典中並且它的前一個字串也在字典中(這個通過dp[4]是否為true來判斷),最終等到子串可以拆分為字典中的單詞。

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        int n=s.length();
        boolean[] dp=new boolean[n+1];
        dp[0]=true;
        for(int i=0;i<n;i++){
            for(int j=0;j<i;j++){
                String tmp=s.substring(j,i);
                if(dp[j]&&wordDict.contains(tmp)){
                    dp[i]=true;
                    break;
                }
            }
        }
        return dp[n];
    }
}