单词拆分(暴力/回溯)

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

 

 

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