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 wordList) {
    	HashSet wlSet = new HashSet(); 
    	for(int i=0;i set = new HashSet();
        Queue queue = new LinkedList();
        queue.add(new Pair2(beginWord,1));
        while(!queue.isEmpty()){
        	Pair2 pair = queue.remove();
        	List list = matchWord(pair.word,wlSet);
        	if(list!=null){
        		for(int i=0;i matchWord(String word,HashSet wordList){
    	List list = new ArrayList();
    	String abc = "qwertyuioplkjhgfdsazxcvbnm";
    	StringBuilder match = new StringBuilder(word);
    	for(int i=0;i

你可能感兴趣的:(算法)