package problems.medium; import java.util.*; /** * Created by sherxon on 2/12/17. */ public class WordLadder { public static void main(String[] args) { System.out.println(); } public int ladderLength(String a, String b, List<String> list) { Map<String, Set<String>> map = new HashMap<>(); map.put(a, new HashSet<>()); Queue<String> q = new LinkedList<>(); for (String s : list) { addVertexAndEdge(s, map); // map.put(s, new HashSet<>()); // for (String key : map.keySet()) { // if (canBeConnected(key, s)) { // map.get(key).add(s); // map.get(s).add(key); // } // } } Set<String> visited = new HashSet<>(list.size()); visited.add(a); q.add(a); Map<String, Integer> d = new HashMap<>(); // distance d.put(a, 1); while (!q.isEmpty()) { String x = q.remove(); for (String s : map.get(x)) { if (!visited.contains(s)) { visited.add(s); d.put(s, d.get(x) + 1); q.add(s); if (s.equals(b)) return d.get(s); } } } return 0; } private void addVertexAndEdge(String s, Map<String, Set<String>> map) { map.put(s, new HashSet<>()); for (String key : map.keySet()) { if (canBeConnected(key, s)) { map.get(key).add(s); map.get(s).add(key); } } } private boolean canBeConnected(String key, String s) { int diff = 0; for (int i = 0; i < key.length(); i++) { if (key.charAt(i) != s.charAt(i)) diff++; if (diff > 1) return false; } return diff == 1; } }