计算字符串的相似度

问题描述

对于给定的两个字符串,可以进行增加、减少或者修改一个字符的方式使一个字符串等于另一个字符串,把需要操作的次数定义为两个字符串的距离,相似度等于“距离+1”的倒数。


分析求解

两个字符串A和B,下标范围为[aBegin,aEnd]和[bBegin,bEnd]

如果第一个字符相等,则不作处理,只需计算A[2,aEnd]和B[2,bEnd]的距离

如果不相等,可以做以下处理

  1. 删除A的第一个字符,然后计算A[2,aEnd]和B[1,bEnd]的距离。

  2. 删除B的第一个字符,然后计算A[1,aEnd]和B[2,bEnd]的距离。

  3. 修改A的第一个字符为B的第一个字符,然后计算A[2,aEnd]和B[2,bEnd]的距离。

  4. 修改B的第一个字符为A的第一个字符,然后计算A[2,aEnd]和B[2,bEnd]的距离。

  5. 添加A的第一个字符到B的第一个字符之前,然后计算A[2,aEnd]和B[1,bEnd]的距离。

  6. 添加B的第一个字符到A的第一个字符之前,然后计算A[1,aEnd]和B[2,bEnd]的距离。

但是我们最终关注的问题是怎样求得两个字符串的距离,也就是说我们只要知道通过一步操作就可以将问题简化成规模更小的问题就可以,没有必要实施这个操作。

那么上面6个操作就可以合并为下面3个操作

  1. 一步操作之后,再处理A[1,aEnd]和B[2,bEnd]。

  2. 一步操作之后,再处理A[2,aEnd]和B[1,bEnd]。

  3. 一步操作之后,再处理A[2,aEnd]和B[2,bEnd]。

代码实现

//*End代表的是要比较的字符串的最后一个字符的下一个位置
int calculate(char *strA, int aBegin, int aEnd, char *strB, int bBegin, int bEnd)
{
	if(aBegin>=aEnd)
	{
		if(bBegin>=bEnd)
			return 0;
		else 
			return bEnd-bBegin;
	}

	if(bBegin>=bEnd)
	{
		if(aBegin>=aEnd)
			return 0;
		else 
			return aEnd-aBegin;
	}

	if(strA[aBegin]==strB[bBegin])
	{
		return calculate(strA,aBegin+1,aEnd,strB,bBegin+1,bEnd);
	}
	else
	{
		int n1 = calculate(strA,aBegin+1,aEnd,strB,bBegin,bEnd);
		int n2 = calculate(strA,aBegin,aEnd,strB,bBegin+1,bEnd);
		int n3 = calculate(strA,aBegin+1,aEnd,strB,bBegin+1,bEnd);
		
		//求最小值+1
		return min(n1,n2,n3) + 1;
	}
}


参考书籍:《编程之美》

转载于:https://my.oschina.net/u/1469592/blog/269096

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值