博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 题目 word break 思路剖析与改进
阅读量:4553 次
发布时间:2019-06-08

本文共 1935 字,大约阅读时间需要 6 分钟。

题目描述:

给一个字符串s,和一个字典dict,判断是否可以按照该字典,对字符串进行分词

例如s="abcabcd", dict={"abc", "abcd"},则返回true。

 

今天心血来潮,剖析一下这道题目的思路。

一拿到这个题目,就是相到简单的深搜了,从头开始枚举所有可能的字串(枚举每一个位置,每一个位置枚举所有以此位置开始的子串,直到结束),一旦发现了合法组合立刻返回true。

于是思路出来了,代码5分钟写完,这能难住我嘛??

word break 朴素实现代码如下:

bool wordBreakHelper(string s,int len, unordered_set
&dict, int pos) { if (pos == len) return true; for (int i = 1; i <= len - pos; i++) { string t = s.substr(pos, i); if (dict.find(t) != dict.end()) { if (wordBreakHelper(s, len, dict, pos + i)) return true; } } return false; } bool wordBreak(string s, unordered_set
&dict) { return wordBreakHelper(s, s.length(), dict, 0); }

提交,Judging,Judging。。。卧槽,超时了

这个时候该思考效率问题了

对每一个子串都枚举,尽管只有子串在dict中找到才进入递归,但是复杂度仍然达到了 O( dict.size() ^ s.length() )。卧槽。

幂次还是过高。

进一步思考,深搜是没问题的,关键是搜索空间一定有许多重复的分支。每个字串最多枚举过一次,那么是哪里重复了呢?仔细推理每一次的搜索,我发觉每一次进入递归的pos参数(就是wordBreakHelper参数中的pos)就是把问题切割成为一个求s从pos开始的子串是否可以break的子问题,这样如果前面已经计算过从pos开始的子串是不可以分割的,下一次就直接无视这个分支了。。。是的,问题解决了。

我们利用一个tag数组,用以标记从pos开始的子串是否可分割。初始全部设置为true,计算过程中逐渐更新tag,每一次进入递归之前先判断tag,再决定是否进入下一步。

修改后的代码如下:

int *tag;bool wordBreakHelper(string s,int len, unordered_set
&dict, int pos){ if (pos == len) return true; for (int i = 1; i <= len - pos; i++) { if (tag[pos]==1) { string t = s.substr(pos, i); if (dict.find(t) != dict.end()){ if (wordBreakHelper(s, len, dict, pos + i)) return true; else tag[pos+i] = 0; } } } return false;}bool wordBreak(string s, unordered_set
&dict){ tag = new int[s.length()]; fill(tag, tag + s.length(), 1); return wordBreakHelper(s, s.length(), dict, 0);}

 

转载于:https://www.cnblogs.com/xlert/p/3964606.html

你可能感兴趣的文章
openstack新建虚机、网络、路由时候对应的ovs网桥的变化
查看>>
linux 编译运行c文件
查看>>
Scrapy的学习和使用
查看>>
7.内部类(一)之详解内部类
查看>>
1.messager消息提示框
查看>>
[PY]进制转换
查看>>
STL系列 list
查看>>
匿名方法和Lambda表达式
查看>>
京东的核心业务
查看>>
读书笔记(六)--成交
查看>>
Secret Number hdu 2113
查看>>
软件架构(体系结构,Architecture)和软件框架
查看>>
阶梯博弈(没怎么搞懂)
查看>>
python request post请求body中有json数组
查看>>
IDT hook KiTrap03
查看>>
字节对齐
查看>>
使用Python SocketServer快速实现多线程网络服务器
查看>>
离散数学
查看>>
外观模式理解和示例
查看>>
IDEA远程仓库版本回滚
查看>>