问题描述
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”.
UPDATE (2017/1/4):
The wordDict parameter had been changed to a list of strings (instead of a set of strings). Please reload the code definition to get the latest changes.解决思路
使用动态规划,dp[i]表示s[0…i-1]是否能被dict中的词组合表示。dp[0] = true。对于dp[i],遍历 j (i-1,i-2,…0),若dp[j] = true, 而且s.substr(j,i-j)在dict中,则dp[i] = true。
结果为dp[len]代码
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
int len = s.length();
set<string> dict;
for (auto x : wordDict)
dict.insert(x);
bool dp[len+1] = {0};
dp[0] = true;
for (int i = 1; i <= len; ++i) {
for (int j = i-1; j >= 0; --j) {
if (dp[j]) {
string tmp = s.substr(j,i-j);
if (dict.find(tmp) != dict.end()) {
dp[i] = true;
}
}
}
}
return dp[len];
}
};