时间限制:1秒 空间限制:32768K 热度指数:35240
题目描述
Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s ="catsanddog",
dict =["cat", "cats", "and", "sand", "dog"].
A solution is["cats and dog", "cat sand dog"].
其实还有一种情况就是剩下的部分不是单词库里的,不过这个题目的样例都是设计好了的。。。就是只要按那个思路就一定对。。。
例如:s=“puyaacgetac” dict =["puyaac", "acget",“ac”,“get”].
此种情况下会出现:puya acget ac 其实是不对的
经过实际实现:以上说法错误,因为当出现这种情况时不会存入
class Solution {
public:
unordered_map<string, vector<string>> m;
vector<string> combine(string word, vector<string> prev){
for(int i=0;i<prev.size();++i){
prev[i]+=" "+word;
}
return prev;
}
vector<string> wordBreak(string s, unordered_set<string>& dict) {
if(m.count(s)) return m[s]; //take from memory
vector<string> result;
for(int i=s.size()-1;i>=0;i--){
string word=s.substr(i,s.size()-1);//[) can not handle one word
if(dict.count(word)&&word!=""){
string rem=s.substr(0,i);
vector<string> prev=combine(word,wordBreak(rem,dict));
result.insert(result.end(),prev.begin(), prev.end());
}
}
if(dict.count(s)){ //a whole string is a word or only remain one word
result.push_back(s);
}
m[s]=result; //memorize
return result;
}
};
实验代码:
#include <iostream>
#include<string>
#include<cstring>
#include<stdio.h>
#include<math.h>
#include<set>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
int p[1000];
int dp[1000];
long long num[1000000+10];
long long t;
map<string, vector<string> > m;
vector<string> combine(string word, vector<string> prev){
for(int i=0;i<prev.size();++i){
prev[i]+=" "+word;
}
return prev;
}
vector<string> wordBreak(string s, set<string>& dict) {
if(m.count(s)) return m[s]; //take from memory
vector<string> result;
for(int i=s.size()-1;i>=0;i--){
string word=s.substr(i,s.size()-1);//[) can not handle one word
if(dict.count(word)&&word!=""){
string rem=s.substr(0,i);
vector<string> prev=combine(word,wordBreak(rem,dict));
result.insert(result.end(),prev.begin(), prev.end());
if(word=="acget"){
cout<<"***"<<endl;
for(int i=0;i<prev.size();++i){
cout<< prev[i]<<endl;;
}
}
}
}
if(dict.count(s)){ //a whole string is a word or only remain one word
result.push_back(s);
}
m[s]=result; //memorize
if(s=="puya"){
cout<<"*"<<endl;
for(int i=0;i<result.size();++i){
cout<<result[i]<<endl;
}
}
return result;
}
int main()
{
set<string>dict;
dict.insert("puyaac");
dict.insert("acget");
dict.insert("ac");
dict.insert("get");
string ss="puyaacgetac";
vector<string>res;
res=wordBreak(ss, dict);
for(int i=0;i<res.size();++i){
cout<<res[i]<<endl;
}
return 0;
}