和127. Word Ladder很像,顺便一起做了

https://leetcode.com/problems/word-ladder/description/

Word Ladder

  • 将每个单词看成是一个节点
  • 如果存在只转换一个字母就可以完成的转换,看作节点间有通路;
  • 给定s1 to s2则可看作为求两点间最短距离问题

由于是unweighted的图所以直接bfs就可以了用不到Dijkstra

代码思路

用两个set: beginset 和endset,理论上应该有一个visited set 但是这个可以用wordList代替,visited了就remove掉

初始里面begin有begin endset里面有end

然后一直找begin的neighbor,用neighbor set 存,这里的思路是word的每个位置都换成a-z

因为每次循环的时间复杂度都是#beginset x word length x 26 所以每次结束后看情况调换一下end 和 begin

Minimum Genetic Mutation

class Solution {
    public int minMutation(String start, String end, String[] bank) {

        char[] GENE = {'A','C','G','T'};

        Set<String> dict = new HashSet<>();
        for(int i=0;i<bank.length;i++){
            dict.add(bank[i]);
        }
        Set<String> startSet = new HashSet<>();
        Set<String> endSet = new HashSet<>();

        dict.remove (start);
        if (!dict.contains(end)) return -1;
        dict.remove(end);

        startSet.add(start);
        endSet.add(end);

        int count =0;

        while(!startSet.isEmpty()&&!endSet.isEmpty()){
            Set<String> neighborSet = new HashSet<>();
            for (String S: startSet){
                for (int i=0;i<S.length();i++){
                    char []chars= S.toCharArray();
                    for(int j=0;j<GENE.length;j++){
                        chars[i]=GENE[j];
                        String tmp = String.valueOf(chars);
                        if(endSet.contains(tmp)) {return count+1;}
                        if (dict.contains(tmp)){
                            neighborSet.add(tmp);
                            dict.remove(tmp);
                        }

                    }chars=S.toCharArray();
                }

            }count++;

            if (neighborSet.size()<endSet.size()){
                startSet=neighborSet;
            }else{
                startSet=endSet;
                endSet=neighborSet;
            }
        }

        return -1;


    }
}

results matching ""

    No results matching ""