[LeetCode] Word Break II 解题思路
Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s = "catsanddog",
dict = ["cat", "cats", "and", "sand", "dog"].
A solution is ["cats and dog", "cat sand dog"].
这道题是 Word Break的一个拓展
问题:根据给的单词字典,求一个字符串所有可能的有效分割。
有了 Word Break 的经验,这道题做起来也顺畅了许多。
假设将字符串 s 分割为两段,[0,i-1], [i, n-1],如果[0, i-1] 为有效单词,[i, n-1]为有效单词集合,那么 s 就是一个有效字符串。将 [0, i-1] 依次和 [i, n-1] 所有可能分别匹配,则得到 s 以 i 为分割点得全部有效分割。
将 i 从 1 到 n-1 遍历一次,则求得 s 的全部分割的可能。
和 Word Break 一样,需要记录已计算的结果,提高效率。利用 map<int, vector<string>> idx_words[k] 来记录 [k, n-1] 子串的全部有效分割。
map<int, vector<string>> idx_words;
vector<string> match(string s, unordered_set<string>& wordDict, int startIdx){
vector<string> res;
for (int i = ; i < s.size(); i++) {
string leftS = s.substr(, i);
unordered_set<string>::iterator us_iter = wordDict.find(leftS);
if (us_iter != wordDict.end()) {
int rightRLIdx = i + startIdx;
vector<string> rightV;
if (idx_words.find(rightRLIdx) != idx_words.end()){
rightV = idx_words[rightRLIdx];
}else{
string rightS = s.substr(i, s.size() - i);
rightV = match(rightS, wordDict, rightRLIdx);
idx_words[rightRLIdx] = rightV;
}
for (int ii = ; ii < rightV.size(); ii++) {
string tmpS = leftS + " " + rightV[ii];
res.push_back(tmpS);
}
}
}
if (wordDict.find(s) != wordDict.end()) {
res.push_back(s);
}
return res;
}
vector<string> wordBreak(string s, unordered_set<string>& wordDict) {
vector<string> res;
res = match(s, wordDict, );
return res;
}
[LeetCode] Word Break II 解题思路的更多相关文章
- LeetCode: Word Break II 解题报告
Word Break II Given a string s and a dictionary of words dict, add spaces in s to construct a senten ...
- 【LeetCode】140. Word Break II 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归求解 日期 题目地址:https://leetc ...
- [leetcode]Word Break II @ Python
原题地址:https://oj.leetcode.com/problems/word-break-ii/ 题意: Given a string s and a dictionary of words ...
- [LeetCode] Word Break II 拆分词句之二
Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each ...
- LeetCode:Word Break II(DP)
题目地址:请戳我 这一题在leetcode前面一道题word break 的基础上用数组保存前驱路径,然后在前驱路径上用DFS可以构造所有解.但是要注意的是动态规划中要去掉前一道题的一些约束条件(具体 ...
- LeetCode Word Break II
原题链接在这里:https://leetcode.com/problems/word-break-ii/ 题目: Given a string s and a dictionary of words ...
- [Leetcode] word break ii拆分词语
Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each ...
- LeetCode: Word Ladder II 解题报告
Word Ladder II Given two words (start and end), and a dictionary, find all shortest transformation s ...
- LeetCode: Word Break II [140]
[题目] Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where ...
随机推荐
- 在cmd窗口下运行Java程序时无法找到主类的解决办法
我是Java的初学者,昨天在cmd窗口下运行一段Java程序时总是有问题,可以编译但无法执行. 也就是javac时正确,一旦java时就不对了,提示找不到或无法加载主类,经百度谷歌再加上自己的摸索终于 ...
- Android之发送短信的两种方式
SMS涉及的主要类SmsManager 实现SMS主要用到SmsManager类,该类继承自java.lang.Object类,下面我们介绍一下该类的主要成员. 公有方法: ArrayList< ...
- 简单图片banner轮播
/**************[css]****************/ <style type="text/css"> *{margin:0px; ...
- Ext.ComponentQuery.query()
转载:http://blog.csdn.net/jiushuai/article/details/7938476 用来找特点的所有容器(Ext.container.Container)或是通过Ext. ...
- NSURLConnection下载
@interface AppDelegate () <NSURLConnectionDataDelegate> { NSMutableData *mData;} @end @impl ...
- 将对象保存至文件——CArchive
CArchive允许以一个二进制的形式保存一个对象的复杂网络,也可以再次装载它们,在内存中重新构造,这一过程叫作串行化/序列化(Serialization),简单的说,CArchive与CFile配合 ...
- sqlite3 小结
sqlite安装 DDL(数据定义语言):create.alter.drop DML(数据操作语言):insert.update.delete DQL(数据查询语言):select sqlite3 命 ...
- linux 命令及进程控制
main.c main.o/main.obj main/main.exe 编译 连接 程序运行; 两步: gcc/g++ -c mai ...
- 使用JDBC连接数据库
JDBC(Java Data Base Connectivity)数据库连接,我们在编写web应用或java应用程序要连接数据库时就要使用JDBC.使用JDBC连接数据库一般步骤有: 1.加载驱动程序 ...
- Q我音乐