|
这题也是大数据过不了!我也想试试adjacent linkedlist! import java.util.*;
public class WordLadderII { public static ArrayList<ArrayList<String>> findLadders(String start, String end, HashSet<String> dict) { if (start == null || end == null || dict == null) return null;
ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>(); ArrayList<String> toRemove = new ArrayList<String>(); HashMap<String, HashSet<String>> traces = new HashMap<String, HashSet<String>>(); Queue<String> queue = new LinkedList<String>(); Queue<Integer> layer = new LinkedList<Integer>(); double minLength = Double.POSITIVE_INFINITY; int pre = 1; queue.add(start); layer.add(1);
while (queue.size() > 0) { String cur = queue.remove(); int distance = layer.remove(); if (distance < minLength){ for (int i = 0; i < start.length(); i++) { for (char symbol = 'a'; symbol <= 'z'; symbol++) { char[] charArray = cur.toCharArray(); if (charArray[i] == symbol) continue; charArray[i] = symbol; String conversion = String.valueOf(charArray); if (conversion.equals(end)) { if (distance + 1 <= minLength) { if (traces.containsKey(conversion)) traces.get(conversion).add(cur); else { HashSet<String> temp = new HashSet<String>(); temp.add(cur); traces.put(conversion, temp); } } } else if (dict.contains(conversion)) { if (pre == distance) toRemove.add(conversion); else { pre = distance; for (String str : toRemove) dict.remove(str); toRemove.clear(); toRemove.add(conversion); } if (traces.containsKey(conversion)) traces.get(conversion).add(cur); else { HashSet<String> temp = new HashSet<String>(); temp.add(cur); traces.put(conversion, temp); } queue.add(conversion); layer.add(distance+ 1); } } } } }
ArrayList<String> path = new ArrayList<String>(); path.add(end);
if (traces.size() != 0) buildPath(end, start, path, traces, result);
return result; } public static void buildPath(String start, String target, ArrayList<String> path, HashMap<String, HashSet<String>> traces, ArrayList<ArrayList<String>> result) { if (start.equals(target)) { result.add(new ArrayList<String>(path)); } else { for (String str : traces.get(start)) { path.add(0, str); buildPath(str, target, path, traces, result); path.remove(0); } } } public static void main(String[] args) { ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>(); HashSet<String> dict = new HashSet<String>(Arrays.asList("hot", "dog")); String start = "hot", end = "dog"; result = findLadders(start, end, dict); for (ArrayList<String> path : result) { System.out.print(path); } } }
|