package com.interview.flag.g; import java.util.*; /** * Created_By: stefanie * Date: 15-1-14 * Time: 上午10:41 */ public class G25_FindMapInConfusedDict { public HashMap<Character, Character> getMap(String[] dict){ HashMap<Character, List<Character>> graph = new HashMap(); HashMap<Character, Integer> indegrees = new HashMap(); HashSet<Character> allChars = new HashSet(); for(int i = 1; i < dict.length; i++){ int firstDifferent = findFirstDifferent(dict[i - 1], dict[i]); if(firstDifferent != -1){ char first = dict[i - 1].charAt(firstDifferent); char second = dict[i].charAt(firstDifferent); allChars.add(first); allChars.add(second); addEdgeGraph(graph, first, second); addInDegree(indegrees, second); } } List<Character> original = new ArrayList(); Queue<Character> queue = new LinkedList(); for(Character ch : allChars){ if(!indegrees.containsKey(ch)) queue.add(ch); original.add(ch); } List<Character> confused = new ArrayList(); while(!queue.isEmpty()){ char ch = queue.poll(); confused.add(ch); if(graph.containsKey(ch)){ for(Character next : graph.get(ch)){ if(indegrees.get(next) > 1) indegrees.put(next, indegrees.get(next) - 1); else queue.offer(next); } } } Collections.sort(original); HashMap<Character, Character> mapping = new HashMap(); for(int i = 0; i < original.size(); i++){ mapping.put(original.get(i), confused.get(i)); } return mapping; } private void addEdgeGraph(HashMap<Character, List<Character>> graph, char from, char to){ if(graph.containsKey(from)){ graph.get(from).add(to); } else { List<Character> dependencies = new ArrayList(); dependencies.add(to); graph.put(from, dependencies); } } private void addInDegree(HashMap<Character, Integer> indegrees, char to){ if(indegrees.containsKey(to)){ indegrees.put(to, indegrees.get(to) + 1); } else { indegrees.put(to, 1); } } private int findFirstDifferent(String s1, String s2){ for(int i = 0; i < s1.length() && i < s2.length(); i++){ if(s1.charAt(i) != s2.charAt(i)) return i; } return -1; } public static void main(String[] args){ G25_FindMapInConfusedDict finder = new G25_FindMapInConfusedDict(); String[] dict = new String[]{"wrt", "wrf", "er", "ett", "rftt","te","ba","bw","fw"}; HashMap<Character, Character> mapping = finder.getMap(dict); for(Map.Entry<Character, Character> entry : mapping.entrySet()){ System.out.println(entry.getKey() + " -> " + entry.getValue()); } } }