力扣127

我丢这题看着听简单的 但是其实内涵玄机 首先你要先想到用到图 同时需要知道每一个word都需要给他一个visit这样的标记 标记是否访问过,同时两个word判断是否能够转化就是判断两个有几个字母不一样 将能够转化的存在一个list里面
大佬的详解
我跟着大佬的思维自己写了一遍

package Leetcode;

import java.util.*;

/*              简述一下这道题 就是在所给的一个所谓的字典 寻找一个单词有没有和给的单词只有一个字母的差别
                的单词有的话这两个词之间就有一条线可以连接 这道题是考图 我只是看懂了大神的解法 自己做还是没办法做出来
                是利用广度优先搜索bfs 来进行
                1.建一个辅助类用来存这个word和这个word的层级 因为咱们是广度优先搜素所以会有层级
                2.建一个函数判断两个字符串之间能不能相互转换也就是不相等的字符数量为1
                3.在辅助函数里面判断beginword是否在字典里面 如果不在的话加上 同时判断endword在不在 不在直接返回0
                4.建一个二维的boolean数组 用来标志字典中的第i和j位置的字符串能否互换 可以的话就设为true
                5.***注意这里 建一个Haspmap数据visited 键类型为String  值类型为boolean
                  是用来记录字典的word有没有被访问过 就是带一个 标志在word上面
                6.建一个队列 (先进先出)存的是辅助类 初始值为 beginword0同时visied设为ture
                7.一个循环只要队列不是空就一直循环
                   1.去除队列首部元素判断word的属性适不适合endword相同 相同就返回层数+1
                   2.建一个List<String>的变量 记录可以和队头元素相互转换的所有word 然后根据二维数组判断这个List<Sting>包函啥
                   3.遍历这个List如果没被访问就讲这个元素入队且层数+1

*
* */
public class Demo127 {
    class LevelWord{//辅助类
        String word;
        int level;
        public LevelWord(String word, int level) {
            this.word = word;
            this.level = level;
        }
    }
    public  int Length2(String beginword, String endword, List<String> wordlist){
        int end=wordlist.indexOf(endword);
        if (end==-1){
            return 0;
        }
        if (!wordlist.contains(beginword)){
            wordlist.add(beginword);//如果没有就加上这个
        }
        boolean[][] nextwords=new boolean[wordlist.size()][wordlist.size()];//二维数组 标志字典的ij位置字符串可以互换
        HashMap<String,Boolean> visited =new HashMap<>();
        for (int i = 0; i < wordlist.size(); i++) {
            for (int j = 0; j < i; j++) {
                if (hasPath(wordlist.get(i).toCharArray(), wordlist.get(j).toCharArray())) {
                    nextwords[i][j] = nextwords[j][i] = true;//判断是否可以转化
                }
            }
            visited.put(wordlist.get(i), false);//设置其他的为false
        }
            Queue<LevelWord> queue = new LinkedList<>();//建一个队列
            queue.add((new LevelWord(beginword,0)));//添加队头
            visited.put(beginword,true);//是否被访问
            while(!queue.isEmpty()){
                LevelWord temp=queue.poll();
                if ((temp.word.equals(endword))){
                    return temp.level+1;
                }
                List<String> nextword =new ArrayList<>();
                int n=wordlist.indexOf(temp.word);//定位这个word的位置是第几个单词
                //利用前面的二维数组判断这个word是不是可以进入这个里面
                for (int i1 = 0; i1 < nextwords.length; i1++) {
                    if (nextwords[n][i1]){
                        nextword.add(wordlist.get(i1));
                    }
                }
                for (int i1 = 0; i1 < nextword.size(); i1++) {
                    String nextTemp =nextword.get(i1);
                    if(!visited.get(nextTemp)){
                        queue.add(new LevelWord(nextTemp,temp.level+1));
                    }
                }
            }

return 0;
    }

    public boolean hasPath(char[] toCharArray, char[] toCharArray1) {
        int diff=0;
        for (int i = 0; i <toCharArray.length ; i++) {
            if (toCharArray[i]!=toCharArray1[i]){
                diff++;
            }
        }
        if (diff==1){
            return true;
        }
        return false;
    }
}

### 如何使用力扣平台 #### 平台概述 力扣是一个专注于算法和数据结构练习的学习平台,提供了丰富的题目资源以及在线评测功能。通过该平台,用户能够针对不同难度级别的题目进行训练,从而提高自身的编程能力和逻辑思维能力。 #### 刷题策略建议 为了高效利用时间并取得更好的学习效果,在力扣上刷题时可以选择特定范围内的高质量题目集中攻克。例如,优先完成前200道经典题目是非常明智的选择[^1]。这些题目涵盖了大部分基础知识点,并且与HOT 100榜单中的高频考点高度吻合。 #### 数据结构专项练习 对于某些具体的数据结构领域如链表操作,则可以通过专门挑选一系列相关联的经典习题来进行深入研究。比如下面列举了一些典型的关于链表处理方面的挑战编号列表供参考[^2]: - 反转单链表 (No. 206) - 移除链表元素 (No. 203) #### 实际案例解析 以一道具体的加油站在环路上行驶场景为例说明如何应用动态规划或者模拟法解决问题。假设存在一组加油站及其对应的燃油供应量数组gas[]及消耗成本数组cost[], 我们要找到一个起点使得车辆能顺利完成一圈旅行而不会中途耗尽燃料。以下是基于上述描述的一个解决方案思路[^3]: ```python def canCompleteCircuit(gas, cost): n = len(gas) total_tank, curr_tank = 0, 0 starting_station = 0 for i in range(n): total_tank += gas[i] - cost[i] curr_tank += gas[i] - cost[i] if curr_tank < 0: starting_station = i + 1 curr_tank = 0 return starting_station if total_tank >= 0 else -1 ``` #### 职业发展导向 另外值得注意的是,除了个人兴趣驱动外,很多人也会因为求职需求加入到每日打卡刷题大军之中。确实如此,无论是BAT还是其他知名互联网公司都会把候选人的算法功底当作重要考核指标之一[^4]。因此合理安排复习计划显得尤为重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值