玖雨y的算法刷题记录day05——图论

玖雨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());
        // key: str, value: path
        map.put(beginStr, 1);

        // abc(1) dbc(2) ebc(2) dec(3) efc(3) dfc(3) def(4)
        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;
                    }                           // 下一节点,注意这里map集合的作用是标记节点是否走过,否则就会死循环
                    if (set.contains(word2) && !map.containsKey(word2)) {
                        map.put(word2, path + 1);
                        queue.offer(word2);
                    }
                }
            }
        }
        System.out.println(0);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值