题目描述
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:
- 拆分时可以重复使用字典中的单词。
- 你可以假设字典中没有重复的单词。
题解
字符串的大多数问题都是动态规划。
1 2 3 4
| dp[i] = ( dp[i-1] && contains(subStr(i-1,i)) ) || ( dp[i-2] && contains(subStr(i-2,i)) ) || ( dp[i-3] && contains(subStr(i-3,i)) ) || ...
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| bool wordBreak(string s, vector<string>& wordDict) { int slen = s.length(); bool* dp = new bool[slen+1]; dp[0] = true; for (int i = 1; i <= slen; i++) dp[i] = false; unordered_set<string> ss; ss.insert(std::begin(wordDict), std::end(wordDict)); for (int i = 1; i <= slen; i++) { for (int j = 0; j < i; j++) { if (dp[j] && ss.count(s.substr(j, i - j))) { dp[i] = true; break; } } } return dp[slen]; }
|