题目描述
给定两个字符串,已知可以使用三种方式进行变换
- 插入一个字符
- 删除一个字符
- 更改一个字符
请设计一个算法,找到两个字符串之间的经历几次最小变换,可以字符串1转换成字符串2
输入描述
输入两个字符串,字符串的长度<=1000
输出描述
最小变换次数
分析:
这道题花费的很长时间,主要还是没有想到用动态规划法,我一直考虑求出最长的非连续的公共子序列问题,有点坑。也就不解释了,看看程序就明白其中的动态规划思想了。平常用的动态规划喜欢
使用以为数组之类的,使用二维数组这是一道典型的题了。
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
* @Author: jiangcw
* @Date: 2019-8-25 上午 10:58
* @Version 1.0
*/
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
String t = br.readLine();
int sLen = s.length();
int tLen = t.length();
int[][] dp = new int[sLen + 1][tLen + 1];
for(int i = 0; i <= sLen; i++) {
dp[i][0] = i;
}
for(int i = 0; i <= tLen; i++) {
dp[0][i] = i;
}
for(int i = 1; i <= sLen; i++) {
for(int j = 1; j <= tLen; j++) {
dp[i][j] = Math.min(dp[i - 1][j - 1] + (s.charAt(i - 1) == t.charAt(j - 1)?0:1),
Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1));
}
}
System.out.println(dp[sLen][tLen]);
}
}