给定一组单词words
,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。若有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的单词则返回空字符串。
示例:
输入: ["cat","banana","dog","nana","walk","walker","dogwalker"] 输出: "dogwalker" 解释: "dogwalker"可由"dog"和"walker"组成。
提示:
0 <= len(words) <= 200
1 <= len(words[i]) <= 100
package Solutionmst1715;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
class Solution {
public String longestWord(String[] words) {
Set<String> set = new HashSet<>();
for (String s : words) {
set.add(s);
}
Arrays.sort(words);
int maxlen = 0;
for (int i = 0; i < words.length; i++) {
if (words[i].length() > maxlen) {
maxlen = words[i].length();
}
}
for (int j = maxlen; j > 0; j--) {
for (int i = 0; i < words.length; i++) {
if (words[i].length() == j) {
//System.out.println(words[i]);
if (wordBreak(words[i], set)) {
return words[i];
}
}
}
}
return "";
}
public boolean wordBreak(String s, Set<String> wordDictSet) {
wordDictSet.remove(s);
boolean[] dp = new boolean[s.length() + 1];
dp[0] = true;
for (int i = 1; i <= s.length(); i++) {
for (int j = 0; j < i; j++) {
//System.out.println("s.substring(j, i)"+s.substring(j, i));
if (dp[j] && wordDictSet.contains(s.substring(j, i))) {
dp[i] = true;
break;
}
}
}
//System.out.println(Arrays.toString(dp));
return dp[s.length()];
}
public static void main(String[] args) {
Solution sol = new Solution();
String[] words = { "ttaaaa","pp","tpa","kpaqkt","tktpqq","aqppatp" };
System.out.println(sol.longestWord(words));
}
}