127 2021-3-30

LC 127

  1. 建立 word-id 哈希表;注意初始化语句
  2. 两层 list 存储节点临接信息
  3. 队列+数组;进行“层级遍历”,建立“可走”的路径(类似二叉树结构),遇到结尾word即停止,统计步数
//思维不难 但很繁杂 ;需要细致耐心
//70 ms(68.26%) 46.6 MB(5.74%)
//还可以建立两个队列,双向检索;遇到访问相同index即停止
class Solution {
    Map<String,Integer> wordID = new HashMap<String,Integer>();
    List<List<Integer>> edge = new ArrayList<List<Integer>>();   //这里是把两层都实例化成了arraylist吗?
    int nodenum=0;

    public void addword(String w){
        if(!wordID.containsKey(w)){
            wordID.put(w,nodenum++);
            edge.add(new ArrayList<Integer>());
        }   
    }


     public void addEdge(String w){
        //edge.add(new ArrayList<Integer>());
        addword(w);
        char[] wsum=w.toCharArray();
        for(int i=0;i<wsum.length;++i){
            char remember = wsum[i];
            wsum[i] = '*';
            String news=new String(wsum);
            
            addword(String.valueOf(wsum));
            edge.get(wordID.get(w)).add(wordID.get(String.valueOf(wsum)));
            edge.get(wordID.get(String.valueOf(wsum))).add(wordID.get(w));
            wsum[i] = remember;
        }
    }


    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        for(String a : wordList){
            addEdge(a);
        }
         if (!wordID.containsKey(endWord)){
            return 0;
        } 

        addEdge(beginWord);
        
        int[] mark=new int [nodenum];
        Arrays.fill(mark, Integer.MAX_VALUE);
        mark[wordID.get(beginWord)]=0;

        Queue<Integer> que= new LinkedList<Integer>();
        que.offer(wordID.get(beginWord));
        while(!que.isEmpty()){
            int curr=que.poll();
            if(curr==wordID.get(endWord)){
                return mark[curr]/2 +1;
            }

            for (int it: edge.get(curr)){
                if(mark[it]== Integer.MAX_VALUE){
                    mark[it]=mark[curr]+1;
                    que.offer(it);
                }
            }
        }
        return 0;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值