LeetCode——Word Break
2015-07-09 15:11
225 查看
这题用暴力匹配的方法做会比较麻烦,需要考虑各种情况,效率也很低,所以采用动态规划来做,代码的简洁性和效率都有较大提高。
这是讨论区里某位童鞋提供的解法:
代码的基本思路是:计算能否匹配到下标为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个点(字符)中哪些是可达的,再检测是否可通过这些可达的点到达下一个点,如果是,则将这点加入可达点的集合;如此迭代下去,可以检测出每个点的可达性,从而知道是否可以到达终点。
这是讨论区里某位童鞋提供的解法:
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个点(字符)中哪些是可达的,再检测是否可通过这些可达的点到达下一个点,如果是,则将这点加入可达点的集合;如此迭代下去,可以检测出每个点的可达性,从而知道是否可以到达终点。
相关文章推荐
- 【CF】223 Div.1 C Sereja and Brackets
- index.dat结构分析
- 解决iis 问题
- ios定位开发 当使用百度地图sdk没有启用object c++混编时就会出现如下错误
- Java语言的动态性支持(一)ScriptEngineManager
- oracle md5加密
- 获取Android界面信息
- 设置CentOS防火墙开放端口
- 质数计算打印程序代码
- NYOJ3——多边形重心问题
- 定义变量用var和不用var的区别。
- Algorithms—56.Merge Intervals
- 常见 core dump 原因分析signal 11 - SIGSEGV
- 南阳oj 题目62 笨小熊
- zookeeper简单搭建(及代码)
- 初碰linux
- 屏幕适配之——图片适配
- iOS多线程总结
- POJ9384 迷宫(基金会BFS)
- codeMirror插件使用讲解