Description
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
1.The same word in the dictionary may be reused multiple times in the segmentation.
2.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
Solution 1(C++)
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
int slen = s.size();
int dictlen = wordDict.size();
vector<bool> dp(slen+1, false);
dp[0] = true;
for(int i=0; i<slen+1; i++){
for(int j=0; j<dictlen; j++){
if(dp[i]){
string temp = s.substr(i, wordDict[j].size());
if(temp == wordDict[j])
dp[i+wordDict[j].size()] =true;
}
}
}
return dp[slen];
}
};
后续更新
其他类似的题目可参考:
- LeetCode-416. Partition Equal Subset Sum
- LeetCode-494. Target Sum
- LeetCode-279. Perfect Squares
- LeetCode-322. Coin Change
算法分析
这道题与之前遇到了两种基本问题:求组合之和等于特定数字的组合个数;求组合之和等于特定数字的组合所需最少个数。也与LeetCode-416. Partition Equal Subset Sum不一样,虽然都是要判断能不能存在这样的组合,但是本题最大一个特点就是:元素组合不是说简单存在即可,而是有先后顺序。
求组合之和等于特定数字的组合个数这种问题,参考:LeetCode-279. Perfect Squares,在这个问题中,并没有考虑组合中元素的顺序问题。但是这道题,需要考虑元素的顺序,比如说:”applepenapple”,第一个元素是”apple”,这个元素必须要在”pen”之前与之后,所以这道题的顺序与前两道题都不一样。
定义A[i]表示0到下标为i的子字符能否被分割成dict中的多个单词。
那么A[i]与A[j],0<=j< i都有关系,即A[i]与前A[]中的前i-1项都有关系,具体为:
如果A[0]为1,判断s中下标从1开始到i结束的字符是否在dict中,如果在,设置A[i]为1,跳出,否则进入第二步;
如果A[1]为1,判断s中下标从2开始到i结束的字符是否在dict中,如果在,设置A[i]为1,跳出,否则进入第二步;
…..
这样一直遍历到A[i-1]位置。
在上面的遍历过程中如果遍历到某一步j,A[j]=1并且j+1到i表示的字符串出现在dict中,表示前j个字符串能分割成dict中的单词,j+1到i中的字符串串也能分割成dict中的单词,这样表示前i个字符能被分割成dict中的单词。
程序分析
略。