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; } };