LeetCode——Word Break

原创 2015年07月09日 15:11:34

        这题用暴力匹配的方法做会比较麻烦,需要考虑各种情况,效率也很低,所以采用动态规划来做,代码的简洁性和效率都有较大提高。

        这是讨论区里某位童鞋提供的解法:

class Solution {
public:
    bool wordBreak(string s, unordered_set<string>& wordDict) {
        int len = s.size();
        if(len == 0) return false;
        set<int> tmp;

        for(int i = 0; i < len; ++i) {
            if(wordDict.find(s.substr(0,i + 1)) != wordDict.end()) {
                tmp.insert(i);
                continue;
            }
            for(set<int>::iterator it = tmp.begin(); it != tmp.end(); ++it) {
                if(wordDict.find(s.substr((*it) + 1, i - (*it))) != wordDict.end()) {
                    tmp.insert(i);
                    break;
                }
            }
        }
        if(tmp.find(len - 1) != tmp.end()) return true;
        else return false;
    }
};

       

       代码的基本思路是:计算能否匹配到下标为i的字符。怎么才算是匹配到下标为i字符了呢?举例来说:若字典为{ "ab", "cd" },待匹配字符串为"abcd",首先"ab"匹配成功,则下标小于等于1的字符都认为是可达的,再匹配"cd"成功,则下标小于等于3的字符也是可达的。最后,判断下标为len("abcd")-1==3的字符是否可达(即可以匹配到),若可以,则表明输入字符串可以按所给字典分割为若干个单词,返回true,否则返回false.

       具体实现时,采用迭代的方法,首先在外层循环中检测前i+1个字符组成的单词是否在字典中,如果在,则第i个字符视为可达的,++i,重复之前的步骤;否则,进入内层循环,遍历set,set中的值k表示小于i的可达下标,即输入字符串的前k+1个字符已经被分割为若干个单词了,这时检测第k+1个字符到第i个字符组成的字符串是否在字典中,如果在,表明set中存在一个k使i可达,跳出循环。若set中不存在k使i可达,则说明输入字符串的第i个字符不可能是分割点,继续外层循环。直到循环结束,若输入字符串的最后一个字符是可达的,则分割成功,否则失败,与其余的字符是否可达没有关系。

       这道题再简化一下,类似于这样的题目:从起始点出发,每次可走若干步,步数由某个给定的规则或集合确定(在本题中由给定的字典确定),求问能否到达终点。本题的解法相当于求出前i个点(字符)中哪些是可达的,再检测是否可通过这些可达的点到达下一个点,如果是,则将这点加入可达点的集合;如此迭代下去,可以检测出每个点的可达性,从而知道是否可以到达终点。

leetcode: Word Break 纪念又一次死在动态规划上

动态规划是算法中的一个基本的算法,但是个人感觉变化很多,有时候知道能够用,但是却想不到思路。 Given a string s and a dictionary of words dict,...
  • qinzhaokun
  • qinzhaokun
  • 2015年10月08日 15:13
  • 682

LeetCode练习-动态规划算法-word-break

题目描述 Given a string s and a dictionary of words dict, determine if s can be segmented into a spa...
  • sinat_31135199
  • sinat_31135199
  • 2017年07月31日 21:02
  • 143

140. Word Break II(dp,字典匹配,并输出所有匹配结果,即保存dp路径)(继续理解,重刷)

Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each ...
  • acm_1361677193
  • acm_1361677193
  • 2016年10月01日 15:07
  • 155

LeetCode 127 Word Ladder java (看某位大神的解法做出来的)

问题重述: Given two words (beginWord and endWord), and a dictionary’s word list, find the length of sh...
  • qq_16166139
  • qq_16166139
  • 2016年04月21日 21:50
  • 968

Leetcode中字符串与break(一)

字符串一直以来都是我不擅长处理的题目,解题思路
  • hello_qingwen
  • hello_qingwen
  • 2014年05月19日 23:18
  • 286

单词分割(Word Break)

package LeetCode; import java.util.ArrayList; import java.util.HashSet; import java.util.List; impo...
  • yanshuanche3765
  • yanshuanche3765
  • 2018年01月04日 11:23
  • 10

Word Break (重重重)

题目: 链接 解答: she
  • skyoceanlover
  • skyoceanlover
  • 2014年08月11日 19:54
  • 207

每天一道算法题(五)Leetcode – Word Break (Java)

是否可以把一个字符串拆分成单词字典dict的一个或多个词
  • u014394715
  • u014394715
  • 2016年04月18日 17:40
  • 497

word break解题报告

Word Break Given a string s and a dictionary of words dict, determine if s can be segmented into a ...
  • lion19930924
  • lion19930924
  • 2016年10月18日 14:33
  • 174

字符串单词拆分 Word Break

问题:给出一个字符串,问能否将其拆分为1或多个单词。单词表已给出。 Given a string s and a dictionary of words dict, determine if s ca...
  • luckyjoy521
  • luckyjoy521
  • 2014年03月17日 10:07
  • 1999
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode——Word Break
举报原因:
原因补充:

(最多只允许输入30个字)