單詞拆分(暴力/回溯)

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章