我丢这题看着听简单的 但是其实内涵玄机 首先你要先想到用到图 同时需要知道每一个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;
}
}