classSolution { public: int trie[20005][26], ed[20005], tot = 1; voidadd(string& s){ int p = 1; for (char& chr : s) { int id = chr - 'a'; if (trie[p][id] == 0) trie[p][id] = ++tot; p = trie[p][id]; } ed[p] = 1; } boolwordBreak(string s, vector<string>& wordDict){ int m = 0; memset(trie, 0, sizeof(trie)), memset(ed, 0, sizeof(ed)); for (int i = 0; i < wordDict.size(); ++i) { add(wordDict[i]); m = max(m, (int)wordDict[i].size()); } int n = s.size(); bool f[305]; memset(f, 0, sizeof(f)); f[0] = 1; // 由于字典树是正向保存的,所以DP改为Push方向 for (int i = 0; i < n; ++i) { if (!f[i]) continue; int p = 1; for (int j = i; j < n && j - i + 1 <= m; ++j) { if (!trie[p][s[j] - 'a']) break; p = trie[p][s[j] - 'a']; if (ed[p]) f[j + 1] = 1; } } return f[n]; } };