题目
- 给一个字符串组成的字典,给一个字符串 s
- 判断字符串 s 是否可以拆分成若干段后,每个子字符串都在字典中
思路
-
先用顺序的 dfs 模拟,TLE 了
-
改用 DP 递推公式,以当前为结尾的字符串,是否可以满足拆分的递推判断是:
- 枚举以当前为结尾组成的字符串,是否在字典中,并且此次拆分剩余的字符串也满足拆分条件
代码
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
set<string> st;
set<char> dict;
int max_len = 0;
for (string& word : wordDict) {
st.insert(word);
max_len = max(max_len, (int)word.size());
}
int n = s.size();
vector<bool> f(n+1);
f[0] = true;
for (int i = 1; i <= n; i++) {
f[i] = false;
for (int j = 1; j <= min(max_len, i); j++) {
if (f[i-j] && st.count(s.substr(i-j,j))) {
f[i] = true;
}
}
}
return f[n];
}
};