題目描述
給定兩個字符串,已知可以使用三種方式進行變換
- 插入一個字符
- 刪除一個字符
- 更改一個字符
請設計一個算法,找到兩個字符串之間的經歷幾次最小變換,可以字符串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]);
}
}