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. JAVA学习笔记系列4-Eclipse版本选择

    下载Eclipse需要根据安装的JDK的版本来决定是安装32位还是64位,不是根据操作系统选的.

  2. C# 流水号生成器开发

    前言 本文将使用一个Nuget公开的组件技术来实现一个流水号生成器,提供了一些简单的API,来方便的实现一个通用的流水号. 在visual studio 中的NuGet管理器中可以下载安装,也可以直接 ...

  3. IOS Block代码块的定义与使用

    代码块的本质是和其他的变量类似,不同的是,代码块存储的数据是一个函数体.使用代码块,你可以像调用其他标准函数一样的调用,可以传入参数,并得到返回值.     脱字符是代码块的语法标记.下图表示代码块的 ...

  4. C++11 类型后置语法

    #include <iostream> #include <typeinfo> #include <type_traits> using namespace std ...

  5. Spring Cloud 请求重试机制核心代码分析

    场景 发布微服务的操作一般都是打完新代码的包,kill掉在跑的应用,替换新的包,启动. spring cloud 中使用eureka为注册中心,它是允许服务列表数据的延迟性的,就是说即使应用已经不在服 ...

  6. 软件工程 week 04

    四则运算 一.摘要 作业地址:https://edu.cnblogs.com/campus/nenu/2016CS/homework/2266 git仓库地址:https://git.coding.n ...

  7. mongodb分片balance

    查看balance状态 mongos> sh.getBalancerState()true   通过balance锁查看balance活动 如果state是2,表示balance锁已经被获取 m ...

  8. Centos7.3 之mysql5.7二进制安装

    #!/bin/bash #注意,该脚本是在centos7.3非生产环境下测试的,其他版本的系统可能不适用,要根据情况修改.需要先下载好mysql二进制包到本地(我一般都是在root家目录下操作,文件也 ...

  9. Linux 开机启动 php socket

    问题 php socket 服务在服务器重启后无法自动启动,需要添加开机启动脚本.有以下问题 开机延迟3分钟后,再启动socket服务 socket服务有3个模块需要按照先后顺序启动  registe ...

  10. 简单的shell脚本练习(一)

    1:求1000一内的偶数和 方法一: #!/bin/bash #用累加实现1000以内的偶数和 sum= ;i<=;i=i+)) do sum=$(($sum+$i)); done echo $ ...