139. Word Break(动态规划)

Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

Note:

  • The same word in the dictionary may be reused multiple times in the segmentation.
  • You may assume the dictionary does not contain duplicate words.

Example 1:

Input: s = "leetcode", wordDict = ["leet", "code"]
Output: true
Explanation: Return true because "leetcode" can be segmented as "leet code".

Example 2:

Input: s = "applepenapple", wordDict = ["apple", "pen"]
Output: true
Explanation: Return true because "applepenapple" can be segmented as "apple pen apple".
             Note that you are allowed to reuse a dictionary word.

Example 3:

Input: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
Output: false






dp[i]  0-i这个字符串是否满足wordbreak

dp[0] = 0

dp[1] =dp[0] && s[0:1] in dict

dp[2] =dp[0] && s[0:1] in dict  ||  dp[1] && s[1:2] in dict

dp[3] =dp[0] && s[0:3] in dict  ||  dp[1] && s[1:3] in dict ||  dp[2] && s[2:3] in dict

dp[i] =dp[0] && s[0:i] in dict || ,,,,,,,||dp[i-1]&& s[i-1:i] in dict


Time complexity O(n^2)

Space complexity O(n)

语法注意:

s = "abcde"; 要得到”ce“

string word = s.substr(2,2);

 1 class Solution {
 2 public:
 3     bool wordBreak(string s, vector<string>& wordDict) {
 4         vector<bool> dp(s.size()+1,false);
 5         unordered_set<string>dict(wordDict.begin(),wordDict.end());
 6         dp[0] = true;
 7         for(int i = 1 ; i<=s.size();i++){
 8             for(int j = 0;j<i;j++){
 9                 string word = s.substr(j,i-j);
10                 if(dp[j]&&dict.find(word)!=dict.end()){
11                     cout<<word<<endl;
12                     dp[i] = true;
13                     break;
14                 }
15             }
16         }
17         return dp[s.size()];
18     }
19 };




参考:
http://zxi.mytechroad.com/blog/leetcode/leetcode-139-word-break/





原文地址:https://www.cnblogs.com/zle1992/p/10271444.html