就是给一个单词词典,给一个开始词汇和结束词汇,在词典中找出开始词汇转变成结束词汇的过程,求转变次数
每次只能转变单词的一个字符
可能会有多条路径可以到达,搜索问题可以用DFS BFS解决,DFS更适合搜索有多少条路径,BFS更适合搜索最小深度
所以这个题最好是用BFS
图的深度优先搜索:一个节点从他能够到达的未走过的节点中选择一个遍历,然后继续往后
图的宽度优先遍历:就是节点分层,可能有多条路径可能走到最后,但我们只关注走了几层
其实我们很容易就想到,接下来应该做的是怎么表示单词之间的转换,可以用邻接表或者邻接矩阵
因为不知道顶点的规模和个数,我们我们此时按照邻接表去做比较合适
这个地方要注意一下,beginword不一定已经存在在wordlist里面,所以要先放进去
我其实看网上,很多都是用hashset或者queue还有map来实现,没有去创建邻接矩阵或者邻接表
所以先创建图再去遍历图,有些复杂了,我们借助队列来进行广度优先遍历
class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
Queue<String>q = new LinkedList<String>();
q.add(beginWord);//先将初始节点加进去
int steps=0;
while(!q.isEmpty()){
int sizeQ=q.size();
for(int i=0;i<sizeQ;i++){//遍历当前层的节点
String temp=q.poll();
if(temp.equals(endWord)){
return steps+1;
}
Iterator<String> it =wordList.iterator();
while(it.hasNext()){
String current = it.next();
//队列中的头和list表中的当前遍历值可以转换
if(canTransform(temp,current)){
q.offer(current);
//使用集合对象 all 的 remove() 方法后,迭代器的结构被破坏了,遍历停止了
//wordList.remove(current);
it.remove();
}
}
}
steps++;
}
return 0;
}
//比较两个单词是否可以转换,也就是只有一位不同
boolean canTransform(String word1, String word2){
int cnt=0;//记录word1 word2不相等字符个数
for(int i=0;i<word1.length();i++){
if(word1.charAt(i)!=word2.charAt(i)){
cnt++;
}
}
return cnt==1;
}
}