class Solution {
    //动态规划 dp[]代表前i个字符能否由List里的字符串组成
    //初始化dp[0] = 0;
    //遍历顺序:从左到右
    //递推公式 
    //s.substring(start,endIndex) start是起始索引,endIndex是结束索引,不包括
    // 排列而不是组合
    public boolean wordBreak(String s, List<String> wordDict) {
            int n = s.length(); 
            boolean[] dp = new boolean[s.length() + 1];  //代表s的前i个元素能否由字典中的元素组成
            dp[0] = true;
            for (int i = 1; i <= n; i++) {
                for (String str : wordDict) {
                    if (i >= str.length() && dp [i - str.length()] && s.substring(i - str.length(), i).equals(str)) {
                        dp[i] = true;
                    }
                }
            } 
            return dp[n];
    }
}