时间复杂度O(NM|s|),空间复杂度O(N)
「C++ 代码」
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param dic string字符串vector
* @return bool布尔型
*/
bool wordDiv(string s, vector<string>& dic) {
int n = s.length();
// dp[i]表示s前i个字符组成的字符串是否是给定字符串数组的子集
vector<bool> dp(n+1);
// 默认空字符串能够由空集组成的
dp[0] = true;
// 从左向右遍历字符串s,先计算完成的dp[i]是后续dp[i]的子问题
for(int i=1; i<=n; ++i){
// 将当前字符串尾部与集合dic中元素逐一比较
for(string& word : dic){
int len = word.length();
if(len<=i){
// 若相同,则dp[i] = dp[i-len]
if(s.substr(i-len,len) == word){
dp[i] = dp[i-len];
// 只要有为真的可能,就可以跳过后续比较,直接计算下一个dp[i]
if(dp[i] == true) break;
}
}
}
}
return dp[n];
}
};