題目描述
給定一個字符串s和一組單詞dict,判斷s是否可以用空格分割成一個單詞序列,使得單詞序列中所有的單詞都是dict中的單詞(序列可以包含一個或多個單詞)。
例如:
給定s=“leetcode”;
dict=[“leet”, “code”].
返回true,因爲"leetcode"可以被分割成"leet code".
此題可以看成是我上一篇的題目的簡易版,只要找到合法的切分,就返回true,就完了,這裏就不細說了,主要是將result改爲了bool變量,然後添加了flag,在找到了合法切分之後,可以終止後面的持續遍歷過程。
代碼如下:
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <list>
#include <set>
#include <unordered_set>
#include <map>
#include <queue>
#include <algorithm>
#include <numeric> //accmulate
#include <functional> //greater<int>()!!!
using namespace std;
class Solution {
public:
bool wordBreak(string s, unordered_set<string> &dict) {
dp = new vector<bool>[s.size()];
for (int i=0;i<s.size();i++){
for (int j=i;j<s.size();j++){
dp[i].push_back(match(s.substr(i,j-i+1), dict));
}
}
output(s.size()-1, s);
return result;
}
bool match(string s, unordered_set<string> &dict){
if (dict.find(s)!=dict.end()) return true;
else return false;
}
void output(int i, string s){
bool flag = false;
if(i==-1){
result= true;
flag = true;
}
else{
for(int k=i;k>=0;k--){
if (dp[k][i-k]){
mystring.push_back(s.substr(k,i-k+1));
output(k-1,s);
if (flag)
return;
else
mystring.pop_back();
}
}
}
}
bool result = false;
vector<string> mystring;
vector<bool> *dp;
};