Word Break

来源:互联网 发布:大数据龙头股票 编辑:程序博客网 时间:2024/05/24 07:10
  • 题目描述
    这里写图片描述
    待实现的函数接口的形参类型,
    bool wordBreak(string s, vector& wordDict) {

    }

  • 分析
    该题使用动态规划的思想能很快解决。我们需要明确以下几点,
    1、只要能找到至少一种分割方法就可以返回true
    2、找寻策略:将s从头开始,每次添加一个字符进行分割,看分割前后的两部分是否正好在字典里有。而分割前后的两部分的找寻策略同上。

  • 代码实现

class Solution {public:    bool wordBreak(string s, vector<string>& wordDict) {        unordered_map<string,int>dict;   //转换wordDict的格式,便于后续操作         unordered_map<string,bool>log; //存储子结果         int maxlen=0;  //字典中最长串的长度         //初始化数据         for(auto x:wordDict){            dict[x]++;            if(x.size()>maxlen)                 maxlen=x.size();        }        //找寻是否可以拆解         return findBreak(s,dict,maxlen,log);    }    bool findBreak(string s, unordered_map<string,int>& dict,int maxlen,unordered_map<string,bool>& log){        if(s.size()==0 || dict[s]>0)             return true;        if(log.count(s)>0)             return log[s];        bool b=false;        for(int i=1;i<s.size()+1;i++){            if(i>maxlen)                break;      //子串比字典中最长串还长             if(dict[s.substr(0,i)]>0)                 b |= findBreak(s.substr(i),dict,maxlen,log);            if(b)                 break;       //至少找到了一种分割了         }        log[s]=b;        return b;    }};
原创粉丝点击