[LeetCode OJ] Word Break 解题报告

来源:互联网 发布:怎样查询电信网络密码 编辑:程序博客网 时间:2024/06/05 17:04

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


0 0
原创粉丝点击