139. Word Breakspa
字符串可否經過劃分紅詞典中的一個或多個單詞。code
使用動態規劃,dp[i]表示當前以第i個位置(在字符串中其實是i-1)結尾的字符串可否劃分紅詞典中的單詞。blog
j表示的是以當前i的位置往前找j個單詞,若是在j個以前能正確分割,那隻需判斷當前這j單詞能不能在詞典中找到單詞。j的個數不能超過詞典最長單詞的長度,且同時不能超過i的索引。索引
初始化時要初始化dp[0]爲true,由於若是你找第一個恰好匹配成功的,你的dp[i - j]確定就是dp[0]。由於多申請了一個,因此dp中的i至關於s中的i-1。rem
s.substr(i-j,j)其實是s.substr(i-j + 1 - 1,j),由於自己應該提取i - j +1,但由於dp位置比s多一個,因此還要-1。字符串
class Solution { public: bool wordBreak(string s, vector<string>& wordDict) { int length = 0; for(string word : wordDict){ if(word.size() > length) length = word.size(); } vector<bool> dp(s.size() + 1,false); dp[0] = true; for(int i = 1;i <= s.size();i++){ for(int j = 1;j <= length && j <= i;j++){ if(dp[i-j]){ string str = s.substr(i-j,j); for(string word : wordDict){ if(word == str){ dp[i] = true; break; } } } } } return dp[s.size()]; } };
140. Word Break IIstring
一個字符串加空字符串仍是原字符串io
class Solution { public: vector<string> wordBreak(string s, vector<string>& wordDict) { unordered_map<string, vector<string>> m; return helper(s, wordDict, m); } vector<string> helper(string s, vector<string>& wordDict, unordered_map<string, vector<string>>& m) { if (m.count(s)) return m[s]; if (s == "") return {""}; vector<string> res; for (string word : wordDict) { if (s.substr(0, word.size()) != word) continue; vector<string> rem = helper(s.substr(word.size()), wordDict, m); for (string str : rem) { res.push_back(word + (str.empty() ? "" : " ") + str); } } m[s] = res; return res; } };