玖雨y的算法刷题记录day05——图论
- 题目链接:字符串接龙
- 题目思路:请注意,本题要求的是最短路径,那么深度优先搜索就更加方便了。这道题目的描述有些含糊,我费了些功夫才搞懂题意,题目的例子中beginStr为abc,从abc开始转换(因为不存在转换序列要输出0,所以推断如果beginStr与endStr相同则输出1),可以转换成dbc(2)、ebc(2),接着二者可以转换成dec(3)、dfc(3)、efc(3),最后可以由dec(3)转换成def(4),因此输出为4。这个过程,便可以抽象为单个字符串的三个字母分别尝试转换为其他字母,如果恰好可以变为endStr,则输出字符串数目结束程序,否则将转换后存在于字典中的字符串入队,并将字符串数目加一。
import java.util.*;
public class Main {
static Set<String> set = new HashSet<>();
static Map<String, Integer> map = new HashMap<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String beginStr = sc.next();
String endStr = sc.next();
for (int i = 0; i < n; i++) set.add(sc.next());
map.put(beginStr, 1);
Queue<String> queue = new LinkedList<>();
queue.offer(beginStr);
while (!queue.isEmpty()) {
String word = queue.poll();
int path = map.get(word);
for (int i = 0; i < word.length(); i++) {
char[] arr = word.toCharArray();
for (char c = 'a'; c <= 'z'; c++) {
arr[i] = c;
String word2 = new String(arr);
if (word2.equals(endStr)) {
System.out.println(path + 1);
return;
}
if (set.contains(word2) && !map.containsKey(word2)) {
map.put(word2, path + 1);
queue.offer(word2);
}
}
}
}
System.out.println(0);
}
}