leetcode 127. Word Ladder

算法思路(BFS):
该算法是一个广度搜索问题,查找变换的最优路径(即变换的次数最少)。在java中,因为不能直接构建的一个数据对,所以只能创建一个类Pair2,有2个成员word和step,含义:到达当前单词所经历的单词总个数(也可以说是路径长度)。创建一个以Pair2为类型的队列,将当前数据对封装成Pair2类对象后放入队列。设置一个String类型HashSet记录已访问的单词。在遍历中,先出队,然后匹配该单词的所有能变换的单词,返回一个String数组,然后遍历该数组,如果找到了目标单词,则返回step+1(因为还有一次变换就能得到,所以+1),如果set中不包含该单词(即没有访问到),则将该单词加入set中并且new一个Pair对象(参数word,step+1)后将其放入队列中。重复上述操作直到队列为空。

注意:在匹配该单词的所有能变换的单词时,需要在一个给定的单词表中查找,题目给定的单词表是list数组,所以查找一个单词的时间复杂的是O(n),如果按照这中方式查找的话,是会超时的,所以应将时间复杂度降到O(1),解决方法:将单词表放入哈希集中,可以实现O(1)时间复杂度的查找。

该算法的时间复杂度O(n2),空间复杂度O(n)。参考代码:

class Pair2{
	String word;
	int step;
	public Pair2(String word,int step){
		this.word = word;
		this.step = step;
	}
}
//leetcode 279. Perfect Squares
    public static int ladderLength(String beginWord, String endWord, List<String> wordList) {
    	HashSet<String> wlSet = new HashSet<String>(); 
    	for(int i=0;i<wordList.size();i++){
    		wlSet.add(wordList.get(i));
    	}
        HashSet<String> set = new HashSet<String>();
        Queue<Pair2> queue = new LinkedList<Pair2>();
        queue.add(new Pair2(beginWord,1));
        while(!queue.isEmpty()){
        	Pair2 pair = queue.remove();
        	List<String> list = matchWord(pair.word,wlSet);
        	if(list!=null){
        		for(int i=0;i<list.size();i++){
        			String s = list.get(i);
        			if(s.equals(endWord))
        				return pair.step+1;
        			if(!set.contains(s)){
        				set.add(s);
        				queue.add(new Pair2(s,pair.step+1));
        			}
        		}
        	}
        }
    	return 0;
    }
    public static List<String> matchWord(String word,HashSet<String> wordList){
    	List<String> list = new ArrayList<String>();
    	String abc = "qwertyuioplkjhgfdsazxcvbnm";
    	StringBuilder match = new StringBuilder(word);
    	for(int i=0;i<match.length();i++){
    		for(int j=0;j<abc.length();j++){
    			match.setCharAt(i, abc.charAt(j));
    			if(!match.toString().equals(word)&&wordList.contains(match.toString()))
    			list.add(match.toString());
    		}
    		match.setCharAt(i, word.charAt(i));
    	}
    	return list;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值