题目地址:https://oj.leetcode.com/problems/word-break-ii/
题意:给一个字典和一个字符串,用字典将字符串中的单词全部提取出来,返回所有可行的结果
解题思路:和word break2一样,由于我是从上往下做的题,所以就直接用了上一题的方法,加了一个canDo()排除了不可能的答案。
顺便提一下,这道题搜索能做。
#include<string>
#include<vector>
#include<unordered_set>
#include<string.h>
using namespace std;
class Solution {
vector<bool> *dp;
bool flag[1024];
public:
bool wordBreak(string s, unordered_set<string> &dict) {
if(!canDo(s,dict)){
return 0;
}
int len = s.size();
dp = new vector<bool>[len];
for(int i=0; i<len; ++i){
for(int j=i; j<len; ++j){
string str = s.substr(i,j-i+1);
dp[i].push_back(match(str,dict));
}
}
return checkAns(0,s);
}
bool canDo(string s, unordered_set<string> &dict){
memset(flag,0,sizeof(flag));
unordered_set<string>::iterator it;
for(it=dict.begin();it!=dict.end();++it){
string str = (*it);
for(int j=0;j<str.size();++j){
flag[str[j]-'a'] = 1;
}
}
for(int j=0;j<s.size();++j){
if(!flag[s[j]-'a']) return 0;
}
return 1;
}
bool match(string& s1,unordered_set<string> &dict){
if(dict.find(s1)==dict.end()){
return 0;
}
else{
return 1;
}
}
bool checkAns(int startPos,string& s){
if(startPos == s.size()){
return 1;
}
bool flag = 0;
for(int len = s.size()-startPos; len>0; --len){
if(dp[startPos][len-1]){
flag = checkAns(startPos+len,s);
if(flag) break;
}
}
return flag;
}
};