给定一个非空字符串 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-break
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
不会只有我第一次看这题目,有点没看懂题意吧~
题意就是将s字符串 依次 划分为多个子串,这些子串必须是wordDict字典中的字符串。
吐槽:LeetCode的控制台真的很垃圾
/**
* 暴力
* @author lenovo
*ans数组用来确定从哪点开始分割,
*如果最后ans[s.length()]的值为false,则说明字符串s不能完全被分割或者不能被分割
*/
public class Main {
public static void main(String[] args) {
String s = "catsandog";
boolean ans[] = new boolean[s.length()+1];
ArrayList<String> wordDict = new ArrayList<>();
wordDict.add("cats");
wordDict.add("dog");
wordDict.add("sand");
wordDict.add("and");
wordDict.add("cat");
ans[0] = true;
for (int i=1; i<=s.length(); i++) {
for (int j=0; j<i; j++) {
if (ans[j]
&& wordDict.contains(s.substring(j, i))) {
ans[i] = true;
break;
}
}
}
System.out.println(ans[s.length()]);
}
}
/**
* dfs
* @author lenovo
*卡死在一个测试点的时间上
*"acaaaaabbbdbcccdcdaadcdccacbcccabbbbcdaaaaaadb"
*["abbcbda","cbdaaa","b","dadaaad","dccbbbc","dccadd","ccbdbc","bbca","bacbcdd","a","*bacb","cbc","adc","c","cbdbcad","cdbab","db","abbcdbd","bcb","bbdab","aa","bcadb","b*acbcb","ca","dbdabdb","ccd","acbb","bdc","acbccd","d","cccdcda","dcbd","cbccacd","ac*","cca","aaddc","dccac","ccdc","bbbbcda","ba","adbcadb","dca","abd","bdbb","ddadbad"*,"badb","ab","aaaaa","acba","abbb"]
*/
public class Main {
public static String ss;
public static List<String> dict;
public static boolean ans[];
public static void main(String[] args) {
String s = "catsandog";
ArrayList<String> wordDict = new ArrayList<>();
wordDict.add("cats");
wordDict.add("dog");
wordDict.add("sand");
wordDict.add("and");
wordDict.add("cat");
System.out.println(wordBreak(s, wordDict));
}
static boolean wordBreak(String s, List<String> workDict) {
ss = s;
dict = workDict;
ans = new boolean[s.length()+1];
ans[0] = true;
dfs(0);
return ans[s.length()];
}
static void dfs(int i) {
if (i == ss.length()) {
return;
}
for (int j=i; j<ss.length()+1; j++) {
if (ans[i]) {
if (dict.contains(ss.substring(i, j))) {
ans[j] = true;
dfs(j);
ans[j] = false;
}
}
}
return;
}
}
/**
*优化
*
*/
public class Main {
public static String ss;
public static List<String> dict;
public static Set<Integer> cache;
public static void main(String[] args) {
String s = "catsandog";
ArrayList<String> wordDict = new ArrayList<>();
wordDict.add("cats");
wordDict.add("dog");
wordDict.add("sand");
wordDict.add("and");
wordDict.add("cat");
System.out.println(wordBreak(s, wordDict));
}
static boolean wordBreak(String s, List<String> workDict) {
ss = s;
dict = workDict;
cache = new HashSet<Integer>();
return dfs(0);
}
static boolean dfs(int i) {
if (i == ss.length()) {
return true;
}
if (cache.contains(i)) {
return false;
}
for (int j=0; j<dict.size(); j++) {
if (ss.startsWith(dict.get(j), i)) {
if (dfs(i+dict.get(j).length())) {
return true;
}
cache.add(i+dict.get(j).length());
}
}
return false;
}
}