LeetCode-【動態規劃】-單詞劃分
阿新 • • 發佈:2018-12-10
給定一個非空字串 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]; } }