20170828_字符串编辑距离_字符串相似度_DP

20170828_字符串编辑距离_字符串相似度_DP


//字符串编辑距离_字符串相似度_DP:
//详细分析:程序员面试宝典P191
/*给定一个源串和目标串,能够对源串作如下操作:
1、修改一个字符
2、增加一个字符
3、删除一个字符
则,把源串通过如上的三种操作之后变成目标串的最小操作次数定义为两个串的距离,而相似度等于
“距离+1的 倒数”。
求其距离和相似度。
分析:
一步操作之后,再将A[2,...,LenA]和B[1,...,lenB]变成相等字符串
一步操作之后,再将A[2,...,LenA]和B[2,...,lenB]变成相等字符串
一步操作之后,再将A[1,...,LenA]和B[2,...,lenB]变成相等字符串
*/
//动态规划问题:DP问题
//假设:dp[i][j]表示strA[i,lenA]与strB[j,lenB]的最小距离,
//则问题的描述为:
//dp[i][j]= dp[i+1][j+1]										if(strA[i]==strB[j])
//        = min( dp[i+1][j], dp[j][i+1], dp[i+1][j+1] )		else

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<numeric>
#include<functional>
using namespace std;

class Solution
{
public:
	void GetMinDistance(const string &strSource, const string &strDest)
	{
		int n=strSource.size();	//源串
		int m=strDest.size();	//目标串
		if(n==0)
			cout<<"最小距离:"<<m<<endl;
		if(m==0)
			cout<<"最小距离:"<<n<<endl;
		//定义一个表格:n+1行m+1列
		vector<vector<int>> dp(n+1, vector<int>(m+1,0));
		//初始化表格
		for(int i=0; i<n; ++i)	//n+1行
			dp[i][m]=n-i;
		for(int j=0; j<m; ++j)
			dp[n][j]=m-j;
		dp[n][m]=0;
		//按照状态转移方程填充表格
		for(int i=n-1; i>=0; --i)
		{
			for(int j=m-1; j>=0; --j)
			{
				if(strSource[i]==strDest[j])
					dp[i][j]=dp[i+1][j+1];
				else
					dp[i][j]=min( min( dp[i][j+1], dp[i+1][j] ), dp[i+1][j+1] )+1;
			}
		}
		cout<<"最小距离:"<<dp[0][0]<<endl;
	}
};

int main(void)
{
	string strSource, strDest;
	class Solution object;
	while (cin>>strSource>>strDest)
	{
		cout<<strSource<<" "<<strDest<<endl;
		object.GetMinDistance(strSource,strDest);
	}

	system("pause");
	return 0;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值