Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:
- Only one letter can be changed at a time
- Each intermediate word must exist in the dictionary
For example,
Given:
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]
As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog"
,
return its length 5
.
Note:
- Return 0 if there is no such transformation sequence.
- All words have the same length.
- All words contain only lowercase alphabetic characters.
要求在给定字典dict中寻找可以变幻的词(只有一位不同)确认是否能够转换至 end 一开始想的是用回溯递归进行遍历求解 但是 由太多的重复情况 而且对于dict的管理也比较麻烦 后来变换思维 不从dict中找词匹配 而是建一个栈 先把需要比较的词 按位 从a-z分别替换 再到dict中查找 若该词存在则加入栈 直至栈空 ps;在替换第j位的字母时 使用 String ntmp=com.substring(0, j)+m+com.substring(j+1,com.length());时 总是说 memory limit exceeded 不知道为什么 改为字符数组后就解决了这问题 代码如下:
public static int ladderLength1(String start, String end, Set<String> dict) {
LinkedList<String> que=new LinkedList<>();
dict.remove(start);
que.offer(start);
int count =0;
int level =1;
int res=1;
while(!que.isEmpty()){
count=level;
level=0;
for(int i=0;i<count;i++){
String com=que.poll();
for(int j=0;j<com.length();j++){
for(char m='a';m<='z';m++){
if(com.charAt(j)==m)continue;
String ntmp=com.substring(0, j)+m+com.substring(j+1,com.length());
if(ntmp.equals(end))return res+1;
if(dict.contains(ntmp)){
level++;
dict.remove(ntmp);
que.add(ntmp);
}
}
}
}
res++;
}
return 0;
}