本人电子系,只为一学生。心喜计算机,小编以怡情。
单词接龙
给出两个单词(start和end)和一个字典,找到从start到end的最短转换序列
比如:
每次只能改变一个字母。
变换过程中的中间单词必须在字典中出现。
注意事项
如果没有转换序列则返回0。
所有单词具有相同的长度。
所有单词都只包含小写字母。
样例
给出数据如下:
start = “hit”
end = “cog”
dict = [“hot”,”dot”,”dog”,”lot”,”log”]
一个最短的变换序列是 “hit” -> “hot” -> “dot” -> “dog” -> “cog”,
返回它的长度 5
策略:广度优先搜索
注意事项:
1、队列的分层,我用特殊标志”!”分开
2、自己编写一个小函数 boolean isonedifferent()
3、visited[] 标记是否已经走过
static public int ladderLength(String start, String end, Set<String> dict) {
// write your code here
if(start.equals(end )) return 1;//一种特殊情况
Queue<String> que=new LinkedList<>();//BFS用到的队列
int visited[]=new int [dict.size()];//用来标记是否已经走过
Object a[]=dict.toArray();//我将字典变成了数组,个人感觉方便一些
que.add(start);
que.add("!");//用特殊符号来隔离各层
int count=0;//计层数
boolean flag=false;//是否已经找到解,先初始false
while(!que.isEmpty())
{
String temp=que.poll();
if(temp.equals("!"))//如果遇到了特殊符号就说明有一层
{
count++;
continue;//这句勿漏
}
if(isonedifferent(temp, end))//当找到解时
{
flag=true;//标记置true
count+=2;//count增2
//原先指向增1,但是总少一个
//debug时发现,找到解时便退出了
//会遗漏最后一个"!",即少加一次
break;//找到解便退出
}
for(int i=0;i<visited.length;i++)
{
if(visited[i]==0&&isonedifferent(temp, a[i].toString()))
{
que.add(a[i].toString());
visited[i]=1;
}
}
if(que.peek().equals("!"))//只有前一层全部poll了
//漏出"!"时,才再加一个特殊符号
//少了if则加特殊符号的隔离作用就消失了
que.add("!");
}
if(flag==false) return 0;//如果没找到解
return count;//找到了就返回值
}
//自己编写的小函数,判断是否只是一个字母不一样
static boolean isonedifferent(String temp,String start)
{
int count=0;
for(int i=0;i<temp.length();i++)
{
if(temp.charAt(i)!=start.charAt(i))
count++;
}
if(count==1) return true;
else
return false;
}