AcWing 190. 字串变换 --BFS-双向搜索

 

已知有两个字串 A, B 及一组字串变换的规则(至多 66 个规则):

A1→B1

A2→B2

规则的含义为:在 A 中的子串 A1A1 可以变换为 B1、A2 可以变换为 B2…。

例如:A=abcd B=xyz

变换规则为:

abc →→ xu ud →→ y y →→ yz

则此时,AA 可以经过一系列的变换变为 BB,其变换的过程为:

abcd →→ xud →→ xy →→ xyz

共进行了三次变换,使得 AA 变换为 BB。

注意,一次变换只能变换一个子串,例如 AA=aa BB=bb

变换规则为:

a →→ b

此时,不能将两个 a 在一步中全部转换为 b,而应当分两步完成。

输入格式

输入格式如下:

A B
A1 B1
A2 B2
… …

第一行是两个给定的字符串A 和 B。

接下来若干行,每行描述一组字串变换的规则。

所有字符串长度的上限为 20。

输出格式

若在 10 步(包含 10 步)以内能将 A 变换为 B ,则输出最少的变换步数;否则输出 NO ANSWER!

输入样例:
abcd xyz
abc xu
ud y
y yz
输出样例:
3
// 包含必要的头文件
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <unordered_map>// 使用标准命名空间
using namespace std;// 定义常量N,表示最多处理的字符串对数
const int N = 6;// n表示实际输入的字符串对数,A和B为初始和目标字符串
int n;
string A, B;
// a数组和b数组分别存储输入的字符串对
string a[N], b[N];/*** extend函数用于从当前队列中扩展新的字符串,尝试从a变换到b* @param q 队列,存储待处理的字符串* @param da 存储从起始字符串到当前字符串的变换次数* @param db 存储从目标字符串到当前字符串的变换次数* @param a 字符串对中的起始字符串数组* @param b 字符串对中的目标字符串数组* @return 如果找到解,则返回变换次数,否则返回11*/
int extend(queue<string>& q, unordered_map<string, int>&da, unordered_map<string, int>& db, string a[N], string b[N])
{// d表示当前处理的字符串的变换次数int d = da[q.front()];// 遍历队列中所有变换次数为d的字符串while (q.size() && da[q.front()] == d){auto t = q.front();q.pop();// 尝试将字符串t中的a[i]替换为b[i]for (int i = 0; i < n; i ++ )for (int j = 0; j < t.size(); j ++ )if (t.substr(j, a[i].size()) == a[i]){// r表示替换后的字符串string r = t.substr(0, j) + b[i] + t.substr(j + a[i].size());// 如果在反向搜索中已经处理过r,则表示找到了解if (db.count(r)) return da[t] + db[r] + 1;// 如果当前方向已经处理过r,则跳过if (da.count(r)) continue;// 更新r的变换次数,并将其加入队列da[r] = da[t] + 1;q.push(r);}}// 如果没有找到解,则返回11return 11;
}/*** bfs函数使用双向BFS搜索,尝试找到从A变换到B的最少次数* @return 如果找到解,则返回变换次数,否则返回-1*/
int bfs()
{// 如果A和B相同,则不需要变换,返回0if (A == B) return 0;// 定义两个队列,分别用于正向和反向搜索queue<string> qa, qb;// 定义两个哈希表,分别存储正向和反向搜索的字符串变换次数unordered_map<string, int> da, db;// 初始化队列和哈希表qa.push(A), qb.push(B);da[A] = db[B] = 0;// step表示当前的变换次数int step = 0;// 当两个队列都不为空时,继续搜索while (qa.size() && qb.size()){int t;// 选择较小的队列进行扩展if (qa.size() < qb.size()) t = extend(qa, da, db, a, b);else t = extend(qb, db, da, b, a);// 如果找到了解,则返回变换次数if (t <= 10) return t;// 如果变换次数超过10,则表示无法找到解,返回-1if ( ++ step == 10) return -1;}// 如果没有找到解,则返回-1return -1;
}/*** main函数为程序的入口点* @return 程序的退出状态*/
int main()
{// 输入初始和目标字符串cin >> A >> B;// 输入字符串对,直到输入结束while (cin >> a[n] >> b[n]) n ++ ;// 使用bfs函数寻找解int t = bfs();// 如果没有找到解,则输出"NO ANSWER!"if (t == -1) puts("NO ANSWER!");// 否则输出变换次数else cout << t << endl;// 程序正常退出return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/70978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023-arXiv-GTE: 基于多阶段对比学习的通用文本嵌入模型

arXiv | https://arxiv.org/abs/2308.03281 gte-Qwen2-1.5B-instruct | https://www.modelscope.cn/models/iic/gte_Qwen2-1.5B-instruct gte-Qwen2-7B-instruct | https://www.modelscope.cn/models/iic/gte_Qwen2-7B-instruct 摘要&#xff1a; 我们提出了GTE&#xff0c;一…

计算机视觉中图像的基础认知

一、图像/视频的基本属性 在计算机视觉中&#xff0c;图像和视频的本质是多维数值矩阵。图像或视频数据的一些基本属性。 宽度&#xff08;W&#xff09; 和 高度&#xff08;H&#xff09; 定义了图像的像素分辨率&#xff0c;单位通常是像素。例如&#xff0c;一张 1920x10…

C语言基本概念————讨论sqrt()和pow()函数与整数的关系

本文来源&#xff1a;C语言基本概念——讨论sqrt()和pow()函数与整数的关系. C语言基本概念——sqrt和pow函数与整数的关系 1. 使用sqrt()是否可以得到完全平方数的精确的整数平方根1.1 完全平方数的计算结果是否精确&#xff1f;1.2 为什么不会出现误差&#xff08;如 1.99999…

Flink提交pyflink任务

1.官方文档&#xff1a; flink1.14:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/deployment/cli/#submitting-pyflink-jobs flink1.18:https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/deployment/cli/#submitting-pyflink-jobs 2.提…

程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<10>

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。 今天我们继续来复习指针… 目录 一、看一段代码二、 一维数组传参的本质三、冒泡排序3.1 基本思想四、二…

隔离型三端口变换器系统仿真与应用(论文+仿真)

1.总体设计 隔离型三端口变换器是一种具有三个端口的电力电子转换器&#xff0c;通常用于实现不同电源之间的能量交换和隔离。该系统广泛应用于太阳能、风能、储能系统以及电动汽车充电等领域&#xff0c;具有能量转换效率高、系统可靠性好、可实现多种工作模式等优点。本文设…

CTF-web:java-h2 堆叠注入rec -- N1ctf Junior EasyDB

代码存在sql注入 // 处理登录表单的POST请求PostMapping({"/login"})public String handleLogin(RequestParam String username, RequestParam String password, HttpSession session, Model model) throws SQLException {// 验证用户凭据if (this.userService.valid…

idea 错误: 找不到或无法加载主类 @C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448

idea 错误: 找不到或无法加载主类 C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448 该错误往往和左下角爱弹出的如下提示是一个意思 Error running ‘PayV3Test1.testTransferBatchesBatchId’ Error running PayV3Test1.testTransferBatchesBatchId. Command lin…

Kerberos认证技术文档

一、概述 Kerberos是一种计算机网络认证协议,旨在通过第三方认证服务,以安全的方式对客户端和服务器进行身份验证。本技术文档将详细介绍如何在Java中实现Kerberos认证,包括自动重新认证机制。 二、Kerberos认证初始化 1. 加载配置文件 在认证之前,需要加载相关的配置文…

Next.js【实用教程】2025最新版

官网 https://nextjs.org/docs/app/getting-started Next.js 简介 Next.js 由 Vercel 开发和维护&#xff0c;旨在解决单页应用&#xff08;SPA&#xff09;和多页应用&#xff08;MPA&#xff09;在性能和 SEO 上的不足。 核心特性 服务端渲染&#xff08;SSR&#xff09;--…

文字转语音(四)使用jacob库实现

项目中有相关的功能&#xff0c;就简单研究了一下。 实现原理 ACOB 库&#xff1a;JAva COM Bridge&#xff0c;允许 Java 通过 COM 接口调用 Windows 组件&#xff08;如 SAPI&#xff09;Speech API (SAPI)&#xff1a;Windows 内置的语音引擎&#xff0c;支持 TTS 功能。 …

KEPServerEX 中信道深入介绍

以下是 KEPServerEX 中信道&#xff08;Channel&#xff09; 的详细介绍&#xff0c;涵盖其定义、功能、配置步骤及最佳实践&#xff0c;帮助您快速掌握信道在数据采集中的核心作用&#xff1a; 一、信道&#xff08;Channel&#xff09;的定义 信道 是 KEPServerEX 中 连接物…

Shell脚本笔记

Linux其他命令 Shell脚本笔记

K8S下载离线安装包所需文件

下载相关文件 官网下载地址集合https://kubernetes.io/zh-cn/releases/download/ 下载相关镜像 官网镜像描述 所有 Kubernetes 容器镜像都被部署到 registry.k8s.io 容器镜像仓库。 容器镜像支持架构registry.k8s.io/kube-apiserver:v1.32.0amd64, arm, arm64, ppc64le, …

Vivado生成edif网表及其使用

介绍如何在Vivado中将模块设为顶层&#xff0c;并生成相应的网表文件&#xff08;Verilog文件和edif文件&#xff09;&#xff0c;该过程适用于需要将一个模块作为顶层设计进行综合&#xff0c;并生成用于其他工程中的网表文件的情况。 例如要将fpga_top模块制作成网表给其它工…

【C++前缀和 排序】891. 子序列宽度之和|2182

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 排序 LeetCode891. 子序列宽度之和 一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums &#xff0c;返回 nums 的所有非空 子序列 的…

企业网站建站源码 网站源码程序下载

在数字化时代&#xff0c;企业网站已成为企业展示形象、推广产品、服务客户的重要窗口。而选择合适的建站源码&#xff0c;则是搭建一个功能强大、美观易用的企业网站的关键。 一、企业网站建站源码的优势 降低成本&#xff1a; 相较于定制开发&#xff0c;使用建站源码可以大…

五款老牌Java报表工具对比

在企业信息化建设中&#xff0c;报表工具是数据可视化与决策支持的核心组件。随着企业对数据分析需求的不断增长&#xff0c;选择一款高效、易用且功能强大的报表工具显得尤为重要。本文将对比五款老牌Java报表工具&#xff0c;并重点介绍由中创微软件自主研发的新一代报表软件…

Android RenderEffect对Bitmap高斯模糊(毛玻璃),Kotlin(1)

Android RenderEffect对Bitmap高斯模糊(毛玻璃)&#xff0c;Kotlin&#xff08;1&#xff09; import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.HardwareRenderer import android.graphics.PixelFormat import android.graphic…

vue3实战-----封装和使用svg图标

vue3实战-----封装和使用svg图标 1.安装和配置svg插件2.解决引入虚拟模块失败的问题3.使用svg4.封装svg组件5.自定义插件注册svg全局组件 在开发项目的时候经常会用到svg矢量图,使用SVG以后,页面上加载的不再是图片资源,这对页面性能来说是个很大的提升,我们SVG文件比img要小的…