WordLadder

来源:互联网 发布:淘宝售后人工客服电话 编辑:程序博客网 时间:2024/06/04 20:57
1.问题描述:
给定一个开始单词,每次只允许经过一个字符的变化,且变化后的单词需要在给定的词典中(不可重复出现),最后变换到结束单词,在这个过程中一共需要变换的最少次数
2.解题思路:
1)每轮开始单词保存在beginSet集合中,每轮结束单词保存在endSet中,已访问过的单词保存在visitedSet中
2)只要beginSet为空或者endSet为空,则不存在这种变换返回0
3)如果beginSet.size()>endSet.size()则需要交换两个集合的元素,相当于从结束词找开始词
4)遍历beginSet中的每个字串元素,对每个字串的每个字符一次只执行一次变换,得到的新词word,判断如果存在于endSet中,则结束返回统计次数+1;判断如果该单词未出现在visited中且新的单词在dict词典中,则该单词有效可作为下一轮的开始单词,因此将该单词加入到临时集合中保存,且加入到visited
5)将临时集合中的元素作为新的beginSet,统计变换次数+1
3.程序源码:
public int ladderLength(String start, String end, HashSet<String> dict) {
        //思路:双端HashSet,将其分为起始集合和结束集合,当起始集合中的单词变换一次后得到结束集合中的某词时可以结束
        //当起始、结束集合中有任意一个为空时,总的也为空
        //由于只有26个字母,因此,采用字母替换法所能达到的26*n在n较大时远远优于n*n
        //init
        HashSet<String> beginSet=new HashSet<String>(); //起始集合
        HashSet<String> endSet=new HashSet<String>(); //终止集合
        HashSet<String> visited=new HashSet<String>(); //访问集合


        beginSet.add(start);
        endSet.add(end);
        visited.add(start);
        int res=1;


        while(!beginSet.isEmpty()&&!endSet.isEmpty()){
            //保证每次对较少数目的endSet做处理
            if(beginSet.size()>endSet.size()){ //保证beginSet.size()<=endSet.size()
                HashSet<String> temp=beginSet;
                beginSet=endSet;
                endSet=temp;
            }


            HashSet<String> temp=new HashSet<String>();


            for(String str:beginSet){
                char[] chs=str.toCharArray();
                for(int i=0;i<chs.length;i++){
                    char old=chs[i];
                    for(char ch='a';ch<='z';ch++){
                        chs[i]=ch;
                        String cur=String.valueOf(chs);
                        if(endSet.contains(cur)){
                            return res+1;
                        }
                        if(!visited.contains(cur)&&dict.contains(cur)){
                            temp.add(cur);
                            visited.add(cur);
                        }
                    }
                    chs[i]=old;
                }


            }
            beginSet=temp;
            res++;
        }
        return 0;
    }
原创粉丝点击