package com.interview.books.ccinterview; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; /** * Created_By: stefanie * Date: 14-12-14 * Time: 下午2:00 */ public class CC34_LongestWordMadeOfOthers { public String find(String[] words){ Comparator<String> comparator = new Comparator<String>() { @Override public int compare(String o1, String o2) { return o2.length() - o1.length(); } }; Arrays.sort(words, comparator); HashMap<String, Boolean> memo = new HashMap<>(); for(String word : words) memo.put(word, true); for(String word : words){ if(canBuildWord(word, true, memo)){ return word; } } return ""; } private boolean canBuildWord(String word, boolean isOriginal, HashMap<String, Boolean> memo) { if(memo.containsKey(word) && !isOriginal) return memo.get(word); boolean canBuilt = false; for(int i = 1; i < word.length(); i++){ String left = word.substring(0, i); String right = word.substring(i); if(memo.containsKey(left) && memo.get(left) == true && canBuildWord(right, false, memo)){ canBuilt = true; break; } } memo.put(word, canBuilt); return canBuilt; } public static void main(String[] args){ CC34_LongestWordMadeOfOthers finder = new CC34_LongestWordMadeOfOthers(); String[] words = new String[]{"banana", "dog", "nana", "walk", "ba", "walker", "dogwalkers"}; System.out.println(finder.find(words)); } }