#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();
    }
};