1183 . 编辑距离
基准时间限制:1 秒 空间限制:65536 KB 分值: 0
编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将kitten一字转成sitting:
sitten (k->s)
sittin (e->i)
sitting (->g)
所以kitten和sitting的编辑距离是3。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。
给出两个字符串a,b,求a和b的编辑距离。
Input
第1行:字符串a(a的长度 <= 1000)。 第2行:字符串b(b的长度 <= 1000)。
Output
输出a和b的编辑距离
Input 示例
kitten sitting
Output 示例
3
编号 | 相关问题 | 分值 |
1006 | 最长公共子序列Lcs | 0 |
1277 | 字符串中的最大值 | 40 |
1088 | 最长回文子串 | 5 |
1089 | 最长回文子串 V2 | 160 |
1157 | 全是1的最大子矩阵 | 40 |
来自 WiKi 的模板:
整數 Levenshtein距離(字符 str1[1..lenStr1], 字符 str2[1..lenStr2]) 宣告 int d[0..lenStr1, 0..lenStr2] 宣告 int i, j, cost 對於 i 等於 由 0 至 lenStr1 d[i, 0] := i 對於 j 等於 由 0 至 lenStr2 d[0, j] := j 對於 i 等於 由 1 至 lenStr1 對於 j 等於 由 1 至 lenStr2 若 str1[i] = str2[j] 則 cost := 0 否則 cost := 1 d[i, j] := 最小值( d[i-1, j ] + 1, // 刪除 d[i , j-1] + 1, // 插入 d[i-1, j-1] + cost // 替換 ) 返回 d[lenStr1, lenStr2]
实际上 与DNA比较类似。。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
#define MAXN 1010
string s, e;
int f[MAXN][MAXN];
int main(){
cin>>s>>e;
for(int i=0; i<s.size(); i++) f[i][0] = i;
for(int j=0; j<e.size(); j++) f[0][j] = j;
for(int i=1; i<=s.size(); i++){
for(int j=1; j<=e.size(); j++){
int c = (s[i-1]!=e[j-1]);
f[i][j] = min( f[i-1][j-1]+c,
min( f[i-1][j]+1, f[i][j-1]+1 ) );
}
}
cout<< f[s.size()][e.size()] <<endl;
return 0;
}