2Sigma OA prepare: Longest Chain
DP use HashMap:
根据string的长度sort,然后维护每个string的longest chain,default为1,如果删除某个char生成的string能提供更长的chain,则更新
1 package twoSigma; 2 3 import java.util.Arrays; 4 import java.util.Comparator; 5 import java.util.HashMap; 6 import java.lang.StringBuilder; 7 8 public class LongestChain { 9 public int findLongestChain(String[] words) { 10 if (words==null || words.length==0) return 0; 11 int longestChain = 0; 12 Arrays.sort(words, new Comparator<String>() { 13 public int compare(String str1, String str2) { 14 return str1.length()-str2.length(); 15 } 16 }); 17 HashMap<String, Integer> map = new HashMap<String, Integer>(); 18 for (String word : words) { 19 if (map.containsKey(word)) continue; 20 map.put(word, 1); 21 for (int i=0; i<word.length(); i++) { 22 StringBuilder sb = new StringBuilder(word); 23 sb.deleteCharAt(i); 24 String after = sb.toString(); 25 if (map.containsKey(after) && map.get(after)+1 > map.get(word)) { 26 map.put(word, map.get(after)+1); 27 } 28 } 29 if (map.get(word) > longestChain) longestChain = map.get(word); 30 } 31 return longestChain; 32 } 33 34 /** 35 * @param args 36 */ 37 public static void main(String[] args) { 38 // TODO Auto-generated method stub 39 LongestChain sol = new LongestChain(); 40 //String[] words = new String[]{"6", "a", "b", "ba", "bca", "bda", "bdca"}; 41 //String[] words = new String[]{"a", "a", "bc", "exf", "abc"}; 42 String[] words = new String[]{"bc", "abc"}; 43 int longestChain = sol.findLongestChain(words); 44 System.out.println(longestChain); 45 } 46 47 }