[LeetCode OJ] Word Break 解题报告

题目地址: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;
    }
};
点赞