139. Word Break

Problem statement:

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. You may assume the dictionary does not contain duplicate words.

For example, given
s = "leetcode",
dict = ["leet", "code"].

Return true because "leetcode" can be segmented as "leet code".

Solution:

Obviously, this is a problem of DP. It belongs to one sequence and one dimension DP problem.

The size of the array is s.size() + 1

The philosophy of this problem is similar with 132. Palindrome Partitioning II, we need compare from j to i, i is current position, while j is the position in front of i. The value of dp[i] depends on dp[j] and string( j , i).

dp[i] means if current string is breakable of not. dp[i] is true only there is a string in front of it is breakable and from i + 1 to j is a word in the dictionary.

The DP formula is:

if(dp[j] && find(wordDict.begin(), wordDict.end(), s.substr(j, i - j)) != wordDict.end()){
    dp[i] = true;
}

return dp[size].

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        int size = s.size();
        vector<bool> dp(size + 1, false);
        dp[0] = true;
        for(int i = 1; i <= size; i++){
            for(int j = 0; j < i; j++){
                if(dp[j] && find(wordDict.begin(), wordDict.end(), s.substr(j, i - j)) != wordDict.end()){
                    dp[i] = true;
                }
            }
        }
        return dp[size];
    }
};

 

posted @ 2017-05-10 09:14  蓝色地中海  阅读(435)  评论(0)    收藏  举报