#include <unordered_map>
class Solution {
public:
// question: 数组子集,能否组成字符串
// waht:用dp数组记录s[0]到s[i-1]能不能被组成
// dp[i] = find(s[j-1]-s[i-1]) && dp[j-1];
// why: 回溯,以数组为头遍历,凑一个,继续找下面的,不行就回溯;
// 记忆就是,记录回溯,能否组成
bool wordDiv(string s, vector<string>& dic) {
vector<int> dp(s.size()+1, 0); //能找到初始化,表示从0到i-1是否能被组成
dp[0] =1;
unordered_set<string> st;
for(string elem:dic){
st.insert(elem);
}
for(int i=1; i<=s.size(); i++){
for(int j=i; j>=1; j--){
if(st.count(s.substr(j-1, i-j+1))){ //数组中有子串
if(dp[j-1] == 1){
dp[i] = 1;
j = -1;
break; //能组成,直接退出
}else{
dp[0] = 0;
}
}
else{
dp[i] = 0;
}
}
}
return dp.back();
}
};