1.问题描述
给定一个字符串s,以及无重复元素的词典dict,找出所有由dict单词组合形成的所有s表示,其中组成同一个s的所有单词之间用空格分割
2.解题思路
动态规划:
1)假设存在全局的map,其key保存用于分割的 字符串s,其value保存所有可能的单词组合
2)如果s在map中,则直接返回其value值
3)如果s不在map中,若s刚好为dict中的一个单词,则将s加入value中;否则认为0~i之间的子串的所有组合为wordBreak(s.substring(0, i),dict),最后一个子串为s.substring(i)
4)如果最后一个子串刚好在dict中,则需要遍历wordBreak(s.substring(0, i),dict)中的所有组合,并将最后一个子串加入到每个组合后面,用“ ”分割
5)map.put(s,ret) //ret为构成s的所有组合
6) return ret;
3.程序源码
import java.util.*;
public class Solution {
Map<String, ArrayList<String>> map = new HashMap<>();
public ArrayList<String> wordBreak(String s, Set<String> dict) {
if(map.containsKey(s))
return map.get(s);
int len = s.length();
ArrayList<String> ret = new ArrayList<>();
if(dict.contains(s))
ret.add(s);
for(int i=1; i<len; i++){
String curr = s.substring(i);
if(dict.contains(curr)){
List<String> strs = wordBreak(s.substring(0, i),dict);
if(strs.size() > 0){
for(String str : strs){
ret.add(str + " " + curr);
}
}
}
}
map.put(s, ret);
return ret;
}
}
public class Solution {
Map<String, ArrayList<String>> map = new HashMap<>();
public ArrayList<String> wordBreak(String s, Set<String> dict) {
if(map.containsKey(s))
return map.get(s);
int len = s.length();
ArrayList<String> ret = new ArrayList<>();
if(dict.contains(s))
ret.add(s);
for(int i=1; i<len; i++){
String curr = s.substring(i);
if(dict.contains(curr)){
List<String> strs = wordBreak(s.substring(0, i),dict);
if(strs.size() > 0){
for(String str : strs){
ret.add(str + " " + curr);
}
}
}
}
map.put(s, ret);
return ret;
}
}