BFS应用:字典问题 Q127. Word Ladder

先贴一个超时的算法,因为这个解法一会就会被覆盖了:) 这个解法没有记录已经访问过的词组,所以问题规模一大马上就超时。

class Solution {
    public int ladderLength(String beginWord, String endWord, List<String> wordList){
        if(!wordList.contains(endWord))
            return 0;
        int ret = 1;
        LinkedList<String> queue = new LinkedList<>();
        queue.offer(beginWord);
        queue.offer(null);
        while(queue.size() != 1 && !queue.isEmpty()) {
            String temp = queue.poll();
            if(temp == null){
                ret++;
                queue.offer(null);
                continue;                
            }
            if(temp.equals(endWord)) {
                //System.out.println("succ ret = " + ret);
                return ret;
            }
            for(String word:wordList) {           
                if(diffOf(temp,word) == 1){
                    //System.out.println("offered " + word);
                    //System.out.println("ret =" + ret);
                    queue.offer(word); 
                }
            }
        }
        return 0;
    }
    private int diffOf(String s1, String s2) {
        if(s1.length() != s2.length())
            return Integer.MAX_VALUE;
        int dif = 0;
        for(int i=0;i < s1.length();i++) {
            if(s1.charAt(i) != s2.charAt(i))
                dif++;
        }
        return dif;    
    }
}

正确解法写完了再粘过来:)

这个是正确解法,tm的还是非常慢,运行了1500ms,可能因为visited不应该用linkedList,看看得了,别学我这算法。

class Solution {
    public int ladderLength(String beginWord, String endWord, List<String> wordList){
        if(!wordList.contains(endWord))
            return 0;
        int ret = 1;
        LinkedList<String> queue = new LinkedList<>();
        LinkedList<String> visited = new LinkedList();
        queue.offer(beginWord);
        queue.offer(null);
        while(queue.size() != 1 && !queue.isEmpty()) {
            String temp = queue.poll();
            if(temp == null){
                ret++;
                queue.offer(null);
                continue;                
            }
            if(temp.equals(endWord)) {
                //System.out.println("succ ret = " + ret);
                return ret;
            }
            for(String word:wordList) {           
                if(diffOf(temp,word) == 1){
                    //System.out.println("offered " + word);
                    //System.out.println("ret =" + ret);
                    if(!visited.contains(word)){
                    visited.offer(word);
                    queue.offer(word); 
                    }
                }
            }
        }
        return 0;
    }
    private int diffOf(String s1, String s2) {
        if(s1.length() != s2.length())
            return Integer.MAX_VALUE;
        int dif = 0;
        for(int i=0;i < s1.length();i++) {
            if(s1.charAt(i) != s2.charAt(i))
                dif++;
        }
        return dif;    
    }
}

改成HashSet了,快了一倍,但是还是挺慢的。。。

class Solution {
    public int ladderLength(String beginWord, String endWord, List<String> wordList){
        if(!wordList.contains(endWord))
            return 0;
        int ret = 1;
        LinkedList<String> queue = new LinkedList<>();
        Set<String> visited = new HashSet<String>();
        queue.offer(beginWord);
        queue.offer(null);
        while(queue.size() != 1 && !queue.isEmpty()) {
            String temp = queue.poll();
            if(temp == null){
                ret++;
                queue.offer(null);
                continue;                
            }
            if(temp.equals(endWord)) {
                //System.out.println("succ ret = " + ret);
                return ret;
            }
            for(String word:wordList) {           
                if(diffOf(temp,word) == 1){
                    //System.out.println("offered " + word);
                    //System.out.println("ret =" + ret);
                    if(!visited.contains(word)){
                    visited.add(word);
                    queue.offer(word); 
                    }
                }
            }
        }
        return 0;
    }
    private int diffOf(String s1, String s2) {
        if(s1.length() != s2.length())
            return Integer.MAX_VALUE;
        int dif = 0;
        for(int i=0;i < s1.length();i++) {
            if(s1.charAt(i) != s2.charAt(i))
                dif++;
        }
        return dif;    
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值