题目:找出最接近的相似串

假设从一个串变化成另一个串所允许的操作只有两种插入一个字符或者删除一个字符。无论是插入还是删除一个符号,均算作一次操作。一般情况下,度量两个串S1和S2的相似性,可以通过从一个串变换成另一个串所需要的最少操作次数来衡量,需要的操作次数越少,则越相似。现给你一个串S,和一个串的集合T,让你找出集合T中与S最相似的串。

测试输入:
abcd
4
abd
abdc
abed
aebcd

预期输出:
abd
aebcd

思想:
这个题的实质就是求从一个字符串变为另一个字符串所需要的步骤数。下面我以从abcd变为baccdba的过程(也是从baccdba变为abcd)为例。列一个表如下,表示从a->b, a->ba, a -> bac … ab ->b, ab -> ba, ba->bac … … 的步骤数。

可以发现:1.如果横竖的字符一样,则a[i][j] = a[i-1][j-1],原因是相当于再没有加这一列字符的情况下加上了这个字符,而又直接得到了目标字符串,所以不需要变化。如下图所示:
2.如果横竖字符不一样,则a[i][j] = min(a[i-1][j] + 1,a[i][j-1] + 1),原因是相当于直接在已得字符串后面直接加上该字符,即操作数加一,或者减去该列的字符后直接得目标字符串,也相当于操作数加一。

具体代码如下:

#include <iostream>
#include <cstring>
#include<string>
#include<algorithm>
using namespace std;string s;
int n;
string a;
int p[21][21];
int MIN = 1e7;
string ma[10];
int N = 0;void Similar()
{cin >> s >> n;for(int i = 0; i < n; i++){cin >> a;for(int k = 0; k < s.size(); k++)p[0][k] = k;for(int k = 0; k < a.size(); k++)p[k][0] = k;for(int k = 1; k <= s.size(); k++){for(int j = 1; j <= a.size(); j++){if(s[k] == a[j])p[k][j] = p[k-1][j-1];else{p[k][j] = min(p[k-1][j]+1,p[k][j-1]+1);}}}if(MIN > p[s.size()][a.size()]){MIN = p[s.size()][a.size()];ma[0] = a;N = 0;}else if(MIN==p[s.size()][a.size()]){N++;ma[N] = a; }} for(int i = 0; i <= N; i++){cout << ma[i] << endl;}
}int main()
{Similar();
}

找出最接近的相似串(DP思想)相关推荐

  1. 编写程序,找出用户输入的一串数的最大数,程序需要提示用户一个一个地输入数,当用户输入0或负数时,程序显示出已输入的最大负整数:

    编写程序,找出用户输入的一串数的最大数,程序需要提示用户一个一个地输入数,当用户输入0或负数时,程序显示出已输入的最大负整数: 代码 #include<stdio.h> #include& ...

  2. 找出连续最长数字串python_字符串中找出连续最长的数字字符串的实例代码

    //1. 写一个函数,它的原形是int continumax(char *outputstr,char *intputstr) //功能: //在字符串中找出连续最长的数字串,并把这个串的长度返回, ...

  3. 找出最接近的数据-MATLAB

    比如要找出一组数A中最接近0.001的数 [~, index]=min(abs(A(:)-0.001)) index是最接近0.001的索引 则最近的值为: Y=A(index):

  4. java 快速找出最接近的2指数的数

    找出与所给数最接近的2的指数的数,比如,3最接近的是4,5最接近的是8,9最接近的是16 public int get num(int a){ int n = a -1; n |= n >> ...

  5. 找出最接近的对称数字

    题目描述 输入一个正整数的字符串,输出与它最接近的对称数字(不包括它自己)的字符串 注1: 输入字符串的长度最多不会超过18 注2: 当大于输入数字和小于输入数字的对称数字与输入数字距离相同时,取小的 ...

  6. 从一个数组中找出最接近目标_LeetCode每日一题 | 转变数组后最接近目标值的数组和...

    题目来源:LC1300 这道题目是一道比较经典的二分查找题. 我们注意到,当value越大时,数组之和越大,当value越小时,数组之和越小.因此,我们可以利用数组之和是value的单调递增函数这个性 ...

  7. 输入一组数,找出满足某条件的数

    1.输入一组数,找出它的最大值,最小值,平均值. 关键点是要把第一个数赋值给min,max,sum 1 #include<iostream> 2 using namespace std; ...

  8. 一个文件,内含一千万行字符串,每个字符串在1K以内,要求找出所有相反的串对

    一个文件,内含一千万行字符串,每个字符串在1K以内,要求找出所有相反的串对,如abc和cba. 当时怎么想的忘记了,现在重新思考一下,文件的大小上限是10G,不可能在内存操作了.考虑设计一种hash使 ...

  9. LeetCode 1738. 找出第 K 大的异或坐标值(DP)

    文章目录 1. 题目 2. 解题 947 / 3851,前 24.6% 2533 / 11282,前 22.5% 1. 题目 给你一个二维矩阵 matrix 和一个整数 k ,矩阵大小为 m x n ...

最新文章

  1. 打牌软件可以控制吗_使用crm软件真的可以帮助企业省钱吗
  2. NoticeView
  3. Mac OS X 安装和配置Scala
  4. 目标检测的二十年发展史—从传统方法到深度学习
  5. 墨菲的鬼魂重现 / 金蝶ERP 资安大漏洞 (非授权补丁自动下载安装)
  6. 我是如何学习写一个操作系统(九):文件系统
  7. 在Ubuntu中为root用户启用界面登录
  8. Maple 教程(一)---初认识
  9. 移动边缘计算卸载技术笔记(一)
  10. web技术基础---网站设计说明书
  11. 粒子滤波 particle filter—从贝叶斯滤波到粒子滤波—Part-V(粒子滤波 PF)
  12. 西农大 Java 实验四 第三题
  13. JAVA系列 IO流 知识结构整理 建立合理的知识框架逻辑 输入输出流 理顺你的思维架构Fileoutput inputStream FileWriter FIleReader结构整理
  14. Pascal中的字符串函数和数学函数
  15. 异常问题解决方案经验总结
  16. %3c php 连接数据库,深究.htaccess的原理,和用户利用其恶意篡改服务器配值导致的深层安全问题...
  17. 关于刚安装的新系统的一些设置
  18. 年产2万吨山楂酒工厂的设计-装瓶工段及车间的设计(lunwen+任务书+开题+选题表+cad图纸)
  19. 本地k8s集群搭建保姆级教程(4)-安装k8s集群Dashboard
  20. 关于pdfobject.js在不同浏览器显示问题

热门文章

  1. 为什么您应该使用基于标准的开发实践
  2. Thrift的服务器和客户端Python案例
  3. gitflow分支管理模型
  4. python 使用import导入不同文件下的文件
  5. python 2x xlrd使用merged_cells 读取的合并单元格为空
  6. Android ViewAnimationUtils (动画) 的使用
  7. 2022-2028年中国木制拼板玩具市场调查研究报告
  8. php function集合
  9. android pop3与imap方式接收邮件(javamail)
  10. asp.net程序性能优化的七个方面