题目描述:
Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s =”catsanddog”,
dict =[“cat”, “cats”, “and”, “sand”, “dog”].
A solution is[“cats and dog”, “cat sand dog”].
listArray结果:
j | listArray[j] |
---|---|
0 | [] |
1 | null |
2 | null |
3 | [cat] |
4 | [cats] |
5 | null |
6 | null |
7 | [send, and] |
8 | null |
9 | null |
10 | [dog] |
思路
我们从第一个字母开始,遍历字典,看从第一个字母开始能组成哪个在字典里的词,如果找到一个,就在这个词的结束位置下一个字母处,建立一个列表,记录下这个词(保存到一个列表的数组)。当遍历完这个词典并找出所有以第一个字母开头的词以后,我们进入下一轮搜索。下一轮搜索只在之前找到的词的后面位置开始,如果这个位置不是一个词的下一个字母位置,我们就跳过。
java代码实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Solution {
static ArrayList<String> res = new ArrayList<String>();
public static void helper(String ans, int index, ArrayList<String>[] listArray) {
if (index == 0) {
res.add(ans.trim());
return;
}
if (listArray[index] == null) {
return;
}
for (String word : listArray[index]) {
helper(word + " " + ans, index - word.length(), listArray);
}
}
public static List<String> wordBreak(String s, Set<String> wordDict) {
ArrayList<String>[] listArray = new ArrayList[s.length()+1];
listArray[0] = new ArrayList<String>();
for (int i = 0; i < s.length(); i++) {
if (listArray[i] == null) continue;
for (int j = i + 1; j <= s.length(); j++) {
String sub = s.substring(i, j);
if (wordDict.contains(sub)) {
if (listArray[j] == null) {
listArray[j] = new ArrayList<String>();
}
listArray[j].add(sub);
}
}
}
for(int j =0; j<=s.length();j++){
System.out.println("j=" + j + ": "+ listArray[j]);
}
helper("", s.length(), listArray);
return res;
}
public static void main(String[] args) {
String s ="catsanddog";
String[] dict ={"cat", "cats", "and", "sand", "dog"};
Set<String> d = new HashSet<>(Arrays.asList(dict));
System.out.println(wordBreak(s,d).toString());
}
}