给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
- 拆分时可以重复使用字典中的单词。
- 你可以假设字典中没有重复的单词。
示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"] 输出: true 解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。
示例 2:
输入: s = "applepenapple", wordDict = ["apple", "pen"] 输出: true 解释: 返回 true 因为"
applepenapple"
可以被拆分成"
apple pen apple"
。 注意你可以重复使用字典中的单词。
示例 3:
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"] 输出: false
解答:利用动态规划来求解。dp[i]表示前i个字符串是否在字典中。为了加快速度,在这里计算字典中最大的字符串长度(字典不为空、无重复字符)
//139 bool wordBreak(string s, vector<string>& wordDict) { unordered_set<string> st(wordDict.begin(),wordDict.end()); vector<bool> dp(s.size()+1,false); dp[0] = true; int maxlength = 0; for(auto a:wordDict) if((int)a.size()>maxlength) maxlength=a.size(); for(int i=1;i<=(int)s.size();i++) for(int j=max(0,i-maxlength);j<i;j++) { if(dp[j] && st.find(s.substr(j,i-j))!=st.end()) {dp[i] = true;break;} } return dp[s.size()]; }//139