leetcode每日一道(11)字符串是否能被切分爲單詞

題目描述

給定一個字符串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;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章