计算两个字符串的距离(递归搜索会爆栈)

2024-06-22 22:32

本文主要是介绍计算两个字符串的距离(递归搜索会爆栈),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*
很经典的可使用动态规划方法解决的题目,和计算两字符串的最长公共子序列相似。
设Ai为字符串A(a1a2a3 … am)的前i个字符(即为a1,a2,a3 … ai)
设Bj为字符串B(b1b2b3 … bn)的前j个字符(即为b1,b2,b3 … bj)
设 L(i,j)为使两个字符串和Ai和Bj相等的最小操作次数。
当ai==bj时 显然 L(i,j) = L(i-1,j-1)
当ai!=bj时 若将它们修改为相等,则对两个字符串至少还要操作L(i-1,j-1)次若删除ai或在bj后添加ai,则对两个字符串至少还要操作L(i-1,j)次若删除bj或在ai后添加bj,则对两个字符串至少还要操作L(i,j-1)次此时L(i,j) = min( L(i-1,j-1), L(i-1,j), L(i,j-1) ) + 1 
显然,L(i,0)=i,L(0,j)=j, 再利用上述的递推公式,可以直接计算出L(i,j)值。
*/
#include<bits/stdc++.h>
using namespace std;
int dp[1000][1000];
int main()
{string a,b;while(cin>>a>>b){memset(dp,0,sizeof(dp));for(int i=0; i<=a.size(); i++)dp[i][0]=i;for(int i=0; i<=b.size(); i++)dp[0][i]=i;for(int i=1; i<=a.size(); i++)for(int j=1; j<=b.size(); j++){if(a[i-1]==b[j-1]){dp[i][j]=dp[i-1][j-1];}else{dp[i][j]=min(dp[i-1][j],min(dp[i-1][j-1],dp[i][j-1]))+1;}}cout<<dp[a.size()][b.size()]<<endl;}return 0;
}
/*
这道题是前几个月Google笔试的最后一道题,当时写的不好,有些细节没写出来,现在整理写一下。
题目描述:
对于不同的字符串,希望能够有办法判断其相似程度。定义了如下方法来把两个不同的字符串变得相同,具体的操作方法为:
1. 修改一个字符 (如把"a"替换为"b")
2. 增加一个字符 (如把"abc"变换为"aabc")
3. 删除一个字符 (如把"abc"变换为"bc")
比如,对于”abc”和”bc”两个字符串来说,可以通过增加/删除一个”a”的方式来达到目的。上面的两种方案,都仅需要一次操作。把这个操作所需要的次数定义为两个字符串的距离,而相似度等于”距离+1”的倒数。也就是说,”abc”和”bc”的距离为1,相似度为1/(1+1)=0.5。
给定任意两个字符串,写出一个算法来计算它们的相似度。
分析:
如果有两个字符串A和B,如果它们的第一个字符是相同的,只要计算A[2,…,lenA]和B[2,…,lenB]的距离。如果它们的第一个字符是不相同的,那么可以进行如下的操作。
1. 删除A的第一个字符,然后计算A[2,…,lenA]和B[1,…,lenB]的距离;
2. 删除B的第一个字符,然后计算A[1,…,lenA]和B[2,…,lenB]的距离;
3. 修改A的第一个字符为B的第一个字符,然后计算A[2,…,lenA]和B[2,…,lenB]的距离;
4. 修改B的第一个字符为A的第一个字符,然后计算A[2,…,lenA]和B[2,…,lenB]的距离;
5. 增加A的第一个字符到B第一个字符之前,然后计算A[2,…,lenA]和B[1,…,lenB]的距离;
6. 增加B的第一个字符到A第一个字符之前,然后计算A[1,…,lenA]和B[2,…,lenB]的距离。
从上面的分析可以看出,如果A和B的第一个字符不相同,那么可以不管之后会变成什么样,就可以把上面的6个操作合并成下面3个。
1. 一步操作之后,计算A[2,…,lenA]和B[1,…,lenB]的距离;
2. 一步操作之后,计算A[1,…,lenA]和B[2,…,lenB]的距离;
3. 一步操作之后,计算A[2,…,lenA]和B[2,…,lenB]的距离。 
这个题目和计算两个字符串的相似度是一样的。点击打开链接
*/
#include<bits/stdc++.h>
using namespace std;
int dist(int pa,int pb,string a,string b)
{if(pa>=a.size()){if(pb>=b.size())return 0;else return b.size()-pb;}if(pb>=b.size()){if(pa>=a.size())return 0;else return a.size()-pa;}if(a[pa]==b[pb]){return dist(pa+1,pb+1,a,b);}else{int n1=dist(pa+1,pb,a,b);int n2=dist(pa,pb+1,a,b);int n3=dist(pa+1,pb+1,a,b);return min(n1,(n2,n3))+1;}return 0;
}
int main()
{string a,b;while(cin>>a>>b){cout<<dist(0,0,a,b)<<endl;}return 0;
}

这篇关于计算两个字符串的距离(递归搜索会爆栈)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1085595

相关文章

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接