这是一题不太明显的动态规划,主要考察的应该是深度优先搜索。
static LinkedList<String> list = new LinkedList<String>(); static ArrayList<String> res=new ArrayList<String>(); public ArrayList<String> wordBreak(String s, List<String> set) { list.clear(); res.clear(); if (s == null || s.length() == 0) return res; if (wordBreakcheck(s, set)) dfs(s, set); return res; } private void dfs(String s, List<String> set) { if (s==null||s.length()==0) { StringBuilder sb = new StringBuilder(); for (String ss : list) { sb.append(ss); sb.append(" "); } res.add(sb.toString().trim()); return; } for (int i = 1; i <= s.length(); i++) { String str=s.substring(0, i); if (set.contains(str)) { list.add(str); //s = s.substring(i, s.length()); dfs(s.substring(i, s.length()), set); list.pollLast(); } } } public boolean wordBreakcheck(String s, List<String> set) { if (s == null || s.length() == 0) return true; boolean[] res = new boolean[s.length() + 1]; res[0] = true; for (int i = 0; i < s.length(); i++) { StringBuilder str = new StringBuilder(s.substring(0, i + 1)); for (int j = 0; j <= i; j++) { if (res[j] && set.contains(str.toString())) { res[i + 1] = true; break; } str.deleteCharAt(0); } } return res[s.length()]; }
if (set.contains(str)) {
list.add(str);
dfs(s.substring(i, s.length()), set);
list.pollLast();
}
if (set.contains(str)) {
list.add(str);
s = s.substring(i, s.length());
dfs(s, set);
list.pollLast();
}
以上两种写法是完全不一样的,已经多次翻车。第一种写法,dfs函数执行完后s然后是没有切割的字符串,而第二种写法是dfs执行完后s已经是切割完的了。