LeetCode 0139. 单词拆分
Posted Tisfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0139. 单词拆分相关的知识,希望对你有一定的参考价值。
【LetMeFly】139.单词拆分
力扣题目链接:https://leetcode.cn/problems/word-break/
给你一个字符串 s
和一个字符串列表 wordDict
作为字典。请你判断是否可以利用字典中出现的单词拼接出 s
。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"] 输出: true 解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
示例 2:
输入: s = "applepenapple", wordDict = ["apple", "pen"] 输出: true 解释: 返回 true 因为"
applepenapple"
可以由"
apple" "pen" "apple" 拼接成
。 注意,你可以重复使用字典中的单词。
示例 3:
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"] 输出: false
提示:
1 <= s.length <= 300
1 <= wordDict.length <= 1000
1 <= wordDict[i].length <= 20
s
和wordDict[i]
仅有小写英文字母组成wordDict
中的所有字符串 互不相同
方法一:dp
用 d p [ i ] dp[i] dp[i]表示字符串的前 i i i个字母能否由字典中的单词拼接出来。
初始值dp[0] = true
用 n n n代表待拼接字符串的长度
第一维循环 i i i从 1 1 1到 n n n,依次判断待拼接字符串的前 i i i个字母能否被拼接。
第二维循环
j
j
j从
0
0
0到
i
−
1
i - 1
i−1,依次判断前i个字母
能否由已验证的能被拼接出来的前j个字母
和存在于字典中的 由 第j个到第i个字母 组成的单词
拼接而成。
如果dp[j]==true
并且原字符串的子串[j, i]
存在于字典中,就把dp[i]
标记为true
- 时间复杂度 O ( n 2 ) O(n^2) O(n2)
- 空间复杂度 O ( n ) O(n) O(n)
AC代码
C++
class Solution
public:
bool wordBreak(string s, vector<string>& wordDict)
unordered_set<string> se;
for (string& s : wordDict)
se.insert(s);
vector<bool> dp(s.size() + 1, false);
dp[0] = true;
for (int i = 1; i <= s.size(); i++)
for (int j = 0; j < i; j++)
if (dp[j] && se.count(s.substr(j, i - j)))
dp[i] = true;
break;
return dp[s.size()];
;
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125991942
以上是关于LeetCode 0139. 单词拆分的主要内容,如果未能解决你的问题,请参考以下文章