WordLadder
来源:互联网 发布:淘宝售后人工客服电话 编辑:程序博客网 时间:2024/06/04 20:57
1.问题描述:
给定一个开始单词,每次只允许经过一个字符的变化,且变化后的单词需要在给定的词典中(不可重复出现),最后变换到结束单词,在这个过程中一共需要变换的最少次数
2.解题思路:
1)每轮开始单词保存在beginSet集合中,每轮结束单词保存在endSet中,已访问过的单词保存在visitedSet中
2)只要beginSet为空或者endSet为空,则不存在这种变换返回0
3)如果beginSet.size()>endSet.size()则需要交换两个集合的元素,相当于从结束词找开始词
4)遍历beginSet中的每个字串元素,对每个字串的每个字符一次只执行一次变换,得到的新词word,判断如果存在于endSet中,则结束返回统计次数+1;判断如果该单词未出现在visited中且新的单词在dict词典中,则该单词有效可作为下一轮的开始单词,因此将该单词加入到临时集合中保存,且加入到visited
5)将临时集合中的元素作为新的beginSet,统计变换次数+1
3.程序源码:
public int ladderLength(String start, String end, HashSet<String> dict) {
//思路:双端HashSet,将其分为起始集合和结束集合,当起始集合中的单词变换一次后得到结束集合中的某词时可以结束
//当起始、结束集合中有任意一个为空时,总的也为空
//由于只有26个字母,因此,采用字母替换法所能达到的26*n在n较大时远远优于n*n
//init
HashSet<String> beginSet=new HashSet<String>(); //起始集合
HashSet<String> endSet=new HashSet<String>(); //终止集合
HashSet<String> visited=new HashSet<String>(); //访问集合
beginSet.add(start);
endSet.add(end);
visited.add(start);
int res=1;
while(!beginSet.isEmpty()&&!endSet.isEmpty()){
//保证每次对较少数目的endSet做处理
if(beginSet.size()>endSet.size()){ //保证beginSet.size()<=endSet.size()
HashSet<String> temp=beginSet;
beginSet=endSet;
endSet=temp;
}
HashSet<String> temp=new HashSet<String>();
for(String str:beginSet){
char[] chs=str.toCharArray();
for(int i=0;i<chs.length;i++){
char old=chs[i];
for(char ch='a';ch<='z';ch++){
chs[i]=ch;
String cur=String.valueOf(chs);
if(endSet.contains(cur)){
return res+1;
}
if(!visited.contains(cur)&&dict.contains(cur)){
temp.add(cur);
visited.add(cur);
}
}
chs[i]=old;
}
}
beginSet=temp;
res++;
}
return 0;
}
给定一个开始单词,每次只允许经过一个字符的变化,且变化后的单词需要在给定的词典中(不可重复出现),最后变换到结束单词,在这个过程中一共需要变换的最少次数
2.解题思路:
1)每轮开始单词保存在beginSet集合中,每轮结束单词保存在endSet中,已访问过的单词保存在visitedSet中
2)只要beginSet为空或者endSet为空,则不存在这种变换返回0
3)如果beginSet.size()>endSet.size()则需要交换两个集合的元素,相当于从结束词找开始词
4)遍历beginSet中的每个字串元素,对每个字串的每个字符一次只执行一次变换,得到的新词word,判断如果存在于endSet中,则结束返回统计次数+1;判断如果该单词未出现在visited中且新的单词在dict词典中,则该单词有效可作为下一轮的开始单词,因此将该单词加入到临时集合中保存,且加入到visited
5)将临时集合中的元素作为新的beginSet,统计变换次数+1
3.程序源码:
public int ladderLength(String start, String end, HashSet<String> dict) {
//思路:双端HashSet,将其分为起始集合和结束集合,当起始集合中的单词变换一次后得到结束集合中的某词时可以结束
//当起始、结束集合中有任意一个为空时,总的也为空
//由于只有26个字母,因此,采用字母替换法所能达到的26*n在n较大时远远优于n*n
//init
HashSet<String> beginSet=new HashSet<String>(); //起始集合
HashSet<String> endSet=new HashSet<String>(); //终止集合
HashSet<String> visited=new HashSet<String>(); //访问集合
beginSet.add(start);
endSet.add(end);
visited.add(start);
int res=1;
while(!beginSet.isEmpty()&&!endSet.isEmpty()){
//保证每次对较少数目的endSet做处理
if(beginSet.size()>endSet.size()){ //保证beginSet.size()<=endSet.size()
HashSet<String> temp=beginSet;
beginSet=endSet;
endSet=temp;
}
HashSet<String> temp=new HashSet<String>();
for(String str:beginSet){
char[] chs=str.toCharArray();
for(int i=0;i<chs.length;i++){
char old=chs[i];
for(char ch='a';ch<='z';ch++){
chs[i]=ch;
String cur=String.valueOf(chs);
if(endSet.contains(cur)){
return res+1;
}
if(!visited.contains(cur)&&dict.contains(cur)){
temp.add(cur);
visited.add(cur);
}
}
chs[i]=old;
}
}
beginSet=temp;
res++;
}
return 0;
}
阅读全文
0 0
- wordLadder
- WordLadder
- leetcode-WordLadder
- LeetCode007:WordLadder
- Leetcode127: wordLadder I
- 刷题——WordLadder
- Leetcode刷题系列(十八)CombinationSum && WordLadder
- 二叉树的遍历
- 36. Valid Sudoku
- 二维码的扫描
- 约数个数定理
- 图的基础概念
- WordLadder
- HTML之:CSS控制的首页初级布局
- PAT-1027.在霍格沃茨找零钱(20)
- 浅谈C++中的构造函数与析构函数
- 57. 局域网控制者:Proxy 服务器
- 实现QQ按下返回键最小化
- HDU 1712 ACboy needs your help (分组背包)
- make用法总结(基于材料:“老托福听力93篇”)
- 655. Print Binary Tree