力扣 139. 单词拆分

61 阅读1分钟

🔗 leetcode.cn/problems/wo…

题目

  • 给一个字符串组成的字典,给一个字符串 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];
        
        
    }
};