题目
原文:
Write a program to find the longest word made of other words.
译文:
写一个程序找出由其他单词组成的最长的单词。
解答
首先将单词按照长度的大小降序排序(重写比较器),再不断地取单词的前缀s,当s存在于单词数组中,递归调用该函数, 判断剩余串是否可以由其它单词组成。如果可以,返回true。
代码如下:
import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; class Q20_7{ public static void main(String[] args){ String[] arr = createGiantArray(); printLongestWord(arr); } static class LengthComparator implements Comparator<String>{ public int compare(String o1,String o2){ return o2.length()-o1.length(); } } public static String printLongestWord(String[] arr){ HashMap<String,Boolean> map=new HashMap<String,Boolean>(); for(String str:arr){ map.put(str,true); } Arrays.sort(arr,new LengthComparator()); for(String s:arr){ if(canBuildWord(s,true,map)){ System.out.println(s); return s; } } return ""; } // DFS深搜 public static boolean canBuildWord(String str,boolean isOriginalWord,HashMap<String,Boolean> map){ if(map.containsKey(str)&&!isOriginalWord){ // 一个词只能由其他词组成,自己不能组成自己! return map.get(str); } for(int i=1;i<str.length();i++){ String left=str.substring(0,i); String right=str.substring(i); if(map.containsKey(left)&&map.get(left)==true&&canBuildWord(right,false,map)){ return true; } } map.put(str,false); // 记录str不能被其他的单词表示,如果以后再遇到str就可以不继续找了 return false; } public static String[] createGiantArray() { String arr[] = {"test", "tester", "testertest", "testing", "apple", "seattle", "banana", "batting", "ngcat", "batti","bat", "testingtester", "testbattingcat"}; return arr; } }
---EOF---