1. 程式人生 > >【演算法分析與設計】【第十五週】139. Word Break

【演算法分析與設計】【第十五週】139. Word Break

動態規劃基礎訓練。

139. Word Break

題目大意

給定一個字串和一個合法詞的集和(詞典),判斷該字串能否由詞典中的片語成。


s= “leetcode”
wordDict = [“leet”,”code”]
return true

思路

《演算法概論》P178Ex6.4

狀態轉移式:

// bool f[i]代表substr[0, i]能否由詞典中的片語成
init:
f[0] = false (if s[0] !∈ wordDict) 
f[0] = true (if
s[0] ∈ wordDict) f[i] = ∪ {f[k] && substr[k+1, i] ∈ wordDict},k = 0, 1, ..., i-1

解題程式碼

坑主要在劃分子串的時候,下標和迭代器的邊界。


class Solution {
public:
  bool isWord(vector<string>& wordDict, string substr) {
    int dictSize = wordDict.size();
    for (int i = 0; i < dictSize; i++) {
      if
(wordDict[i] == substr) return true; } return false; } bool wordBreak(string s, vector<string>& wordDict) { int len = s.length(); string substr; if (len == 0) { if (isWord(wordDict, "")) return true; else return false; } if (len == 1) { if (isWord(wordDict, substr.assign(s.begin(), s.begin()+1
))) return true; else return false; } bool f[len]; if (isWord(wordDict, substr.assign(s.begin(), s.begin()+1))) f[0] = true; else f[0] = false; bool flag = false; for (int i = 1; i < len; i++) { for (int k = 0; k < i; k++) { substr.assign(s.begin()+k+1, s.begin()+i+1); if ((f[k] == true && (isWord(wordDict, substr)) == true) || isWord(wordDict, substr.assign(s.begin(), s.begin()+i+1)) == true) { f[i] = true; flag = true; break; } } if (flag == false) f[i] = false; flag = false; } //for (int i = 0; i < len; i++) cout << f[i] << " "; if (f[len-1] == true) return true; else return false; } }; // Runtime: 16 ms

時間複雜度

O(n^3)

可以說是直接把狀態轉移式照搬了,還需要優化