字符串编辑距离
2015-04-24 23:05
218 查看
有两个字符串A和B,对A可以进行如下的操作:插入一个字符,删除一个字符,替换一个字符。问A可以通过最少多少次操作变为B?我们定义这个结果为字符串的最小编辑距离。状态转移方程:
当A!=B[j]时
f[j]=1+min{f[i-1][j],f[j-1],f[i-1][j-1]}
当A==B[j]时
f[j]=f[i-1][j-1]
/**
* 暴力搜索
*
* @param A
* @param B
* @return
*/
public int getMinDistance(String A, String B) {
if (A == null && B == null)
return 0;
if (A == null)
return B.length();
if (B == null)
return A.length();
return getMinDistance(A, A.length() - 1, B, B.length() - 1);
}
private int getMinDistance(String A, int Aright, String B, int Bright) {
if (Aright == 0 && Bright == 0)
return (A.charAt(Aright) == B.charAt(Bright)) ? 0 : 1;
if (Aright == 0) {
for(int i=0;i<=Bright;i++){
if(B.charAt(i)==A.charAt(0)){
return Bright;
}
}
return 1+Bright;
}
if (Bright == 0) {
for(int i=0;i<=Aright;i++){
if(A.charAt(i)==B.charAt(0)){
return Aright;
}
}
return 1+Aright;
}
if (A.charAt(Aright) == B.charAt(Bright)) {
return getMinDistance(A, Aright - 1, B, Bright - 1);
} else {
int t1 = getMinDistance(A, Aright - 1, B, Bright);
int t2 = getMinDistance(A, Aright, B, Bright - 1);
int t3 = getMinDistance(A, Aright - 1, B, Bright - 1);
t1 = t1 < t2 ? t1 : t2;
return (t1 < t3 ? t1 : t3) + 1;
}
}
当A!=B[j]时
f[j]=1+min{f[i-1][j],f[j-1],f[i-1][j-1]}
当A==B[j]时
f[j]=f[i-1][j-1]
/**
* 暴力搜索
*
* @param A
* @param B
* @return
*/
public int getMinDistance(String A, String B) {
if (A == null && B == null)
return 0;
if (A == null)
return B.length();
if (B == null)
return A.length();
return getMinDistance(A, A.length() - 1, B, B.length() - 1);
}
private int getMinDistance(String A, int Aright, String B, int Bright) {
if (Aright == 0 && Bright == 0)
return (A.charAt(Aright) == B.charAt(Bright)) ? 0 : 1;
if (Aright == 0) {
for(int i=0;i<=Bright;i++){
if(B.charAt(i)==A.charAt(0)){
return Bright;
}
}
return 1+Bright;
}
if (Bright == 0) {
for(int i=0;i<=Aright;i++){
if(A.charAt(i)==B.charAt(0)){
return Aright;
}
}
return 1+Aright;
}
if (A.charAt(Aright) == B.charAt(Bright)) {
return getMinDistance(A, Aright - 1, B, Bright - 1);
} else {
int t1 = getMinDistance(A, Aright - 1, B, Bright);
int t2 = getMinDistance(A, Aright, B, Bright - 1);
int t3 = getMinDistance(A, Aright - 1, B, Bright - 1);
t1 = t1 < t2 ? t1 : t2;
return (t1 < t3 ? t1 : t3) + 1;
}
}
相关文章推荐
- 第29章:字符串编辑距离
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 求两个字符串的编辑距离
- (51Nod 1183 编辑距离)字符串编辑距离
- 字符串编辑距离
- 8.动态规划(1)——字符串的编辑距离
- 编辑距离 字符串相似度问题
- 字符串“编辑距离”(最大公共子串提取)
- 字符串的编辑距离
- 求两个字符串的编辑距离
- Edit Distance(编辑距离)算法。计算两个字符串的相似程度。
- 最大子序列,最长递增子序列,最长公共字串,最长公共子序列,字符串编辑距离
- 字符串编辑距离与拼写错误检查
- 程序员编程艺术第二十八~二十九章:最大连续乘积子串、字符串编辑距离
- 字符串编辑距离(Levenshtein距离)算法
- DP求两个字符串的编辑距离
- 计算两个字符串编辑距离
- Trie树求多个字符串最短编辑距离的空间优化
- 求两个字符串的编辑距离
- 字符串编辑距离