LC 127
- 建立 word-id 哈希表;注意初始化语句
- 两层 list 存储节点临接信息
- 队列+数组;进行“层级遍历”,建立“可走”的路径(类似二叉树结构),遇到结尾word即停止,统计步数
class Solution {
Map<String,Integer> wordID = new HashMap<String,Integer>();
List<List<Integer>> edge = new ArrayList<List<Integer>>();
int nodenum=0;
public void addword(String w){
if(!wordID.containsKey(w)){
wordID.put(w,nodenum++);
edge.add(new ArrayList<Integer>());
}
}
public void addEdge(String w){
addword(w);
char[] wsum=w.toCharArray();
for(int i=0;i<wsum.length;++i){
char remember = wsum[i];
wsum[i] = '*';
String news=new String(wsum);
addword(String.valueOf(wsum));
edge.get(wordID.get(w)).add(wordID.get(String.valueOf(wsum)));
edge.get(wordID.get(String.valueOf(wsum))).add(wordID.get(w));
wsum[i] = remember;
}
}
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
for(String a : wordList){
addEdge(a);
}
if (!wordID.containsKey(endWord)){
return 0;
}
addEdge(beginWord);
int[] mark=new int [nodenum];
Arrays.fill(mark, Integer.MAX_VALUE);
mark[wordID.get(beginWord)]=0;
Queue<Integer> que= new LinkedList<Integer>();
que.offer(wordID.get(beginWord));
while(!que.isEmpty()){
int curr=que.poll();
if(curr==wordID.get(endWord)){
return mark[curr]/2 +1;
}
for (int it: edge.get(curr)){
if(mark[it]== Integer.MAX_VALUE){
mark[it]=mark[curr]+1;
que.offer(it);
}
}
}
return 0;
}
}