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. 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:
题意:判断给定string数组中是否含有能组成给定字符串s的子字符串集合。
思路:动态规划。新建一个长度为s.length()+1的bool数组dp,除数组第一位用于方便通过进入循环的边界判断外,其他每一位对应字符串s的每一个字符。
当dp[i]=true时,表示在字符串数组中,存在一个这样的字符串,等同于在字符串s中,从任意一个或多个下标为0,1,2,...,i-1开始,到下标为i结束的子字符串。
从头开始对字符串s进行遍历,这样循环操作之后,dp[s.length()]就是所求得的判断布尔值。
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
vector<bool> dp(s.length() + 1, false);
dp[0] = true;
for (int i = 1; i <= s.size(); i++) {
for (int j = 0; j < i; j++) {
if (dp[j]) {
string ss = s.substr(j, i - j);
vector<string>::iterator iter = find(wordDict.begin(), wordDict.end(), ss);
if (iter != wordDict.end()) {
dp[i] = true;
break;
}
}
}
}
return dp[s.length()];
}
};