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

补充一个python的实现:

 class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
n = len(s)
wordDict = set(wordDict)
dp = [False] * (n + )
dp[] = True
for i in range(,n+):
for j in range(i-,-,-):
if dp[j] and s[j:i] in wordDict:
dp[i] = True
break
return dp[n]

dp是bool类型的一维数组,长度是n+1,每个元素表示:从第一个字符开始,到当前位置的(子)字符串,是否可以由字典中的单词表示。

判断策略是对当前子字符串的一次(逆序)遍历。

遍历过程为:以当前字符为结尾,向前遍历,每次找到一个分割位置j,

将子字符串分为“前部”,“后部”两个部分,“前部”是s[0]~s[j-1],“后部”是s[j]~s[i]。

判断当前dp值是否为True,需要满足两个条件:

1.“前部”子串可以由字典中的单词表示;

2.“后部”子串存在于字典中。

在逆序遍历当前子字符串的过程中,只要找到一个位置可以满足上述两个条件,即可标记当前位置dp值为True,结束内层循环。

如果逆序遍历到全字符串s的头部(索引为0)仍然没有找到符合上述两个条件的位置,那说明当前位置不能由字典中的单词表示,内存循环结束,继续外层循环。

leetcode139的更多相关文章

  1. LeetCode139:Word Break

    Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...

  2. [Swift]LeetCode139. 单词拆分 | Word Break

    Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine ...

  3. LeetCode139:Word Break

    题目: Given a string s and a dictionary of words dict, determine if s can be segmented into a space-se ...

  4. 【1】【leetcode-139】【回溯超时、动态规划】单词拆分

    给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词.你可以假设字典中没有重复的 ...

  5. Leetcode139. Word Break单词拆分

    给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可以假设字典中没有重复 ...

随机推荐

  1. numpy.where() 用法详解

    numpy.where (condition[, x, y]) numpy.where() 有两种用法: 1. np.where(condition, x, y) 满足条件(condition),输出 ...

  2. windows mysql 的myini

    地址 :C:\ProgramData\MySQL\MySQL Server 5.7

  3. C++ 常用设计模式(学习笔记)

    1.工厂模式:简单工厂模式.工厂方法模式.抽象工厂模式 1).简单工厂模式:主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类. typedef enum { T80 ...

  4. 第七十九课 最短路径(Floyd)

    程序如下: #ifndef GRAPH_H #define GRAPH_H #include "Object.h" #include "SharedPointer.h&q ...

  5. jmeter压测、操作数据库、分布式linux下运行、webservice接口测试、charles抓包

    一.jmeter压测 在线程组中设置好,然后添加http请求,t添加聚合报告查看压力测试结果,如图: 一般压测时间10-15分钟,如果是稳定性测试,一般n*12小时,这些并发用户一直在请求. tps: ...

  6. js基础概念-操作符

    操作符是操作数据值的符号,也叫做运算符. 按照操作个数分为:一元运算符,二元运算符,三元运算符. 按功能分为:位操作符,布尔操作符,乘性操作符,加性操作符,关系操作符,关系操作符,相等操作符,条件操作 ...

  7. 软件工程 week 03

    一.效能分析 1.作业地址:https://edu.cnblogs.com/campus/nenu/2016CS/homework/2139 2.git地址:https://git.coding.ne ...

  8. web driver下载地址(selenium-3.141_浏览器版本对应)

    web driver: (Windows环境下) Firefox(上一目录可以找其他浏览器的driver) : 1)http://npm.taobao.org/mirrors/geckodriver/ ...

  9. 移动Web端资源整合

    meta篇 viewreport 视窗宽度 <meta name="viewport" content="width=device-width,initial-sc ...

  10. redis使用get key中文变成十六进制编码

    redis-cli 后面加上 --raw 解决中文显示问题 redis-cli -h 127.0.0.1 -p 端口 -a 密码  --raw 不带 --raw 参数: redis-cli -h &g ...