标签:etc 单词 ted OLE add class 遍历 bool amp
给定一个非空字符串s和包含非空单词列表的字典wordDict,请确定s是否可以分段为一个或多个字典单词的以空格分隔的序列。
注:(1)字典中的同一单词可以在分割中多次重复使用。
(2)可以认为字典中没有重复的单词。
Input: s = "leetcode", wordDict = ["leet", "code"]
Output: true
Explanation: Return true because "leetcode" can be segmented as "leet code".
Input: s = "applepenapple", wordDict = ["apple", "pen"]
Output: true
Explanation: Return true because "applepenapple" can be segmented as "apple pen apple".
Input: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
Output: false
使用动态规划
substring
在字典中,而之前的子串也left substring
在字典中,那么我们知道str.substring(0,i)是正确的。 J == 0,因为第一个子字符串之前没有任何内容(dp [j-1]不存在) public boolean wordBreak(String s, List<String> wordDict) {
if(s == null || s.length() == 0) return false;
boolean[] dp = new boolean[s.length()];
for(int i=0;i<s.length();i++){ //遍历s字符串
for(int j = 0;j<=i;j++){ //遍历【0-i】的子串
if(j == 0 || dp[j-1]){ //dp【j-1】为true,说明【0,j-1】的子串都在字典中。
String sub = s.substring(j,i+1);//截取子串
if(wordDict.contains(sub)){ //判断知否在字典中
dp[i] = true; //【0,i】都在字典中
}
}
}
}
return dp[s.length()-1];
}
使用DFS算法
private HashSet<Integer> set = new HashSet<>();
public boolean wordBreak(String s, List<String> wordDict) {
HashSet<Integer> set = new HashSet<>();//记录匹配不到的位置的索引
return dfs(s,0,wordDict,set);
}
private boolean dfs(String s,int index,List wordDict,Set set){
if(index == s.length()) return true;
if(set.contains(index)) return false; //防止重复搜索
for(int i=index+1;i<=s.length();i++){
String sub = s.substring(index,i);
//当【index,i)能够匹配到字典中的元素,从i开始继续匹配
//如果【i,length)都匹配不到,则回溯,从上一个匹配到的子串继续向下匹配
if(wordDict.contains(sub) && dfs(s,i,wordDict,set)){
return true;
}
}
set.add(index); //如果匹配不到,将匹配开始位置加入set
return false;
}
标签:etc 单词 ted OLE add class 遍历 bool amp
原文地址:https://www.cnblogs.com/le-le/p/12892000.html