BiruLyu
8/24/2017 - 12:26 AM

433. Minimum Genetic Mutation(#1 two-end BFS).java

class Solution {
    private static final char[] candidates = new char[] {'A', 'G', 'C', 'T'};
    public int minMutation(String start, String end, String[] bank) {
        Set<String> bankSet = new HashSet<>(Arrays.asList(bank));
        Set<String> frontier = new HashSet<>();
        Set<String> frontierEnd = new HashSet<>();
        if (!bankSet.contains(end)) {
            return -1;
        } else {
            bankSet.remove(end);
        }
        frontier.add(start);
        frontierEnd.add(end);
        int res = 1;
        while (!frontier.isEmpty() && !frontierEnd.isEmpty()) {
            Set<String> temp = new HashSet<>();
            for (String str : frontier) {
                char[] s = str.toCharArray();
                for (int i = 0; i < s.length; i++) {
                    for (int j = 0; j < 4; j++) {
                        char backup = s[i];
                        if (s[i] != candidates[j]) {
                            s[i] = candidates[j];
                            String next = new String(s);
                            if (frontierEnd.contains(next)) return res;
                            if (bankSet.contains(next)) {
                                temp.add(next);
                                bankSet.remove(next); // visited
                            }
                        }
                        s[i] = backup;
                    }
                }
            }
            res++;
            if (temp.size() < frontierEnd.size()) {
                frontier = temp;
            } else {
                frontier = frontierEnd;
                frontierEnd = temp;
            }
        }
        return -1;
        
    }
}