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;
}