对于不同的字符串,我们希望能有办法的判断相似度,我们定义了一套操作方法,来把两个不相同的
的字符的变的相同,具体的操作方法如下:
1.修改的一个字符,入吧“a”替换成为“b”.
2.增加一个字符,入吧“abcd”变为“aebdb”.
3.删除一个字符,入吧“traveing”
import java.util.*;
import java.io.*;
/*
这道题其实简单的理解就是为了求字符串的最小编辑代价,也是一个经典的动态规划题,复杂度O(M*N)
思路:1.求解状态转移矩阵dp[M + 1][N + 1],dp[i][j] 的值代表的是str1[0...i-1]编辑为str2[0...j-1]
的最小代价。
2. 计算过程:
1)dp[0][0] = 0,表示str1空的字串编辑为str2空的字串代价为0。
2)矩阵dp第一列即为dp[0...M-1][0],dp[i][0] 表示str1[0...i-1]编辑为空串的最小代价,所以就是将str1[0..M-1]的字符删掉的代价
所以dp[i][0] = i;
3) 同2),那str2[0...j-1]编辑的代价,dp[0][j] = j;
4) 接下来的位置就按照从左到右,从上到下来计算,dp[i][j]的值来至于下面的几种情况:
(1)str1[0...i-1]可以先编辑为str1[0..i-2],也就是删除字符str1[i-1],然后由str1[0..i-2]编辑为str2[0...j-1],dp[i-1][j]表示str1[0..i-2]编辑为str2[0...j-1]的最小代价,
那么dp[i][j]可能等于dp[i -1][j] + 1;
(2)str1[0...i-1]可以先编辑为str1[0..i-2],然后将str2[0..j-2]插入字符str2[j-1],编辑成str2[0...j-1],dp[i][j-1]表示str1[0..i-1]编辑成str2[0...j-2]的最小代价,
那么dp[i][j] 可能等于dp[i][j-1] + 1;
(3) 如果str1[i - 1]!=str2[j-1] ,那么先把str1[0..i-1]中的str1[0..i-2]的部分边长str2[0..j-2],然后把字符str1[i-1]替换为str2[j-1],这样str1[0..i-1]就编辑成为str2[0...j-1]了,dp[i - 1][j - 1]表示
str1[0..i-2]编辑为str2[0..j-2]的最小代价,那么dp[i ][j]可能等于dp[i - 1][j - 1] + 1;
(4) 如果str1[i - 1]==str2[j-1] ,那么先把str1[0..i-1]中的str1[0..i-2]的部分边长str2[0..j-2],因为此时 str1[i - 1]==str2[j-1] ,所以str1[0..i-1]已经编辑为str2[0..j-1]了,dp[i - 1][j - 1]表示str1[0..i-2]编辑为str2[0..j-2]的最小代价, 那么dp[i ][j]可能等于dp[i - 1][j - 1]。
上述的4中情况取最小值,dp的最右下角就是最终结果,即最小编辑代价。
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(
new InputStreamReader(System.in)
);
String s1 = "";
while ( null != (s1 = in.readLine()) ){
//将两个输入字符串转为数组
String s2=in.readLine();
char[] cs1=s1.toCharArray();
char[] cs2=s2.toCharArray();
int[][] dp=new int[s1.length()+1][s2.length()+1];
//用动态规划的方式获取一个数组变为另一个数组的步骤次数
//初始化二维数组
for(int row=1;row<=s1.length();row++){
dp[row][0]=row;
}
for(int col=1;col<=s2.length();col++){
dp[0][col]=col;
}
//动态规划
for(int row=1;row<=s1.length();row++){
for(int col=1;col<=s2.length();col++){
if(cs1[row-1]==cs2[col-1]){
dp[row][col]=dp[row-1][col-1];
}
else{
int min1=Math.min(dp[row-1][col],dp[row][col-1])+1;
dp[row][col]=Math.min(min1,dp[row-1][col-1]+1);
}
}
}
System.out.println("1/"+ (dp[s1.length()][s2.length()]+1) );
}
}
}
添加笔记
求解