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

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实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

Python中经纬度距离计算的实现方式

《Python中经纬度距离计算的实现方式》文章介绍Python中计算经纬度距离的方法及中国加密坐标系转换工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj... 目录一、基本方法1. 使用geopy库(推荐)2. 手动实现 Haversine 公式3. 使用py

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda