关闭

Leetcode165: Word Break

标签: leetcodealgorithm
167人阅读 评论(0) 收藏 举报
分类:

Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

For example, given
s = "leetcode",
dict = ["leet", "code"].

Return true because "leetcode" can be segmented as "leet code".

题目意思是,给定词典的情况下,看看原字符串能不能全部成功地被给定的词典分割。一开始,最自然的想法是,使用递归。提交,超时了。想想,这个问题其实具有动态规划的特点。比如计算catsanddog的分割方式,那么倒着想如下:
到了最后一个字符g的时候,
如果能在g之前切一刀,也就是说,如果g在词典中以及catsanddo能够成功切分,那么原字符串就可以成功切分。
或者,如果能在og之前切一刀,也就是说,如果og在词典中以及catsandd能够成功切分,那么原字符串就可以成功切分。
或者,如果能在dog之前切一刀,也就是说,如果dog在词典中以及catsand能够成功切分,那么原字符串就可以成功切分。
或者,如果能在ddog之前切一刀,也就是说,如果ddog在词典中以及catsan能够成功切分,那么原字符串就可以成功切分。
或者,如果能在nddog之前切一刀,也就是说,如果nddog在词典中以及catsa能够成功切分,那么原字符串就可以成功切分。
或者,如果能在anddog之前切一刀,也就是说,如果anddog在词典中以及cats能够成功切分,那么原字符串就可以成功切分。
或者,如果能在sanddog之前切一刀,也就是说,如果sanddog在词典中以及cat能够成功切分,那么原字符串就可以成功切分。
或者,如果能在tsanddog之前切一刀,也就是说,如果tsanddog在词典中以及ca能够成功切分,那么原字符串就可以成功切分。
或者,如果能在atsanddog之前切一刀,也就是说,如果atsanddog在词典中以及c能够成功切分,那么原字符串就可以成功切分。
或者,如果能在catsanddog之前切一刀,也就是说,如果catsanddog在词典中以及""能够成功切分,那么原字符串就可以成功切分。
使用一个数组bool wordB[i] 来记录,在单词长度为i的时候,能否成功切分(i取值范围必然为[ 0, word.length() ] )

class Solution {
public:
    bool wordBreak(string s, unordered_set<string>& wordDict) {
        vector<bool> wordB(s.length() + 1, false);  
        wordB[0] = true;  
        for (int i = 1; i < s.length() + 1; i++) {  
            for (int j = i - 1; j >= 0; j--) {  
                if (wordB[j] && wordDict.find(s.substr(j, i - j)) != wordDict.end()) {  
                    wordB[i] = true;  
                    break; //只要找到一种切分方式就说明长度为i的单词可以成功切分,因此可以跳出内层循环。  
                }  
            }  
        }  
        return wordB[s.length()];  
    }  
};


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:64546次
    • 积分:2301
    • 等级:
    • 排名:第16936名
    • 原创:148篇
    • 转载:119篇
    • 译文:0篇
    • 评论:4条
    个人主页
    文章分类
    最新评论