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]; } };