DFS和BFS时的补救方法
题目:https://leetcode.cn/problems/word-break/description/?favorite=2cktkvj
139. 单词拆分
中等
给你一个字符串 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
参考:参考链接
KEY:单纯使用DFS发现大部分通过了,但是部分样例超时了
-
public class Solution {
-
String s;
-
List<String> wordDict;
-
int n;
-
boolean res = false;
-
public boolean wordBreak(String s, List<String> wordDict) {
-
this.s = s;
-
this.wordDict = wordDict;
-
n = s.length();
-
for(int i=0;i<n;i )
-
{
-
dfs(0,i);
-
}
-
return res;
-
}
-
void dfs(int start,int end)
-
{
-
//[start,end]期间是否可以作为一个单词
-
String subString = s.substring(start,end 1);
-
if(wordDict.contains(subString))
-
{
-
if(end == n-1)
-
{
-
//结束了
-
res = true;
-
return;
-
}
-
for(int i=end 1;i<n;i )
-
dfs(end 1,i);
-
}
-
}
-
-
public static void main(String[] args) {
-
Solution s = new Solution();
-
System.out.println(s.wordBreak("leetcode", Arrays.asList("leet","code")));
-
-
}
-
}
直接用记忆化搜索补救!
加入dp[][]//进行缓存
-
public class Solution {
-
int[][] dp;
-
String s;
-
List<String> wordDict;
-
int n;
-
boolean res = false;
-
public boolean wordBreak(String s, List<String> wordDict) {
-
this.s = s;
-
this.wordDict = wordDict;
-
this.dp = new int[n 1][n 1];//1->true,0->null,-1->false
-
Arrays.fill(dp,0);
-
n = s.length();
-
for(int i=0;i<n;i )
-
{
-
dfs(0,i);
-
}
-
return res;
-
}
-
void dfs(int start,int end)
-
{
-
//[start,end]期间是否可以作为一个单词
-
String subString = s.substring(start,end 1);
-
if(wordDict.contains(subString))
-
{
-
dp[start][end] = 1;
-
if(end == n-1)
-
{
-
//结束了
-
res = true;
-
return;
-
}
-
for(int i=end 1;i<n;i )
-
{
-
if(dp[end 1,n-1] == 1)
-
-
dfs(end 1,i);
-
}
-
-
}
-
dp[start][end] =-1;
-
}
-
-
public static void main(String[] args) {
-
Solution s = new Solution();
-
System.out.println(s.wordBreak("leetcode", Arrays.asList("leet","code")));
-
-
}
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfiejha
系列文章
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13