給定一個非空字符串 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;
}
}