1. 插入一个字符
2. 删除一个字符
3. 更改一个字符
请设计一个算法,找到两个字符串之间的经历几次最小变换,可以字符串1转换成字符串2
数据范围:输入字符串的长度满足
import java.util.Scanner; /** * @Author: coderjjp * @Date: 2020-05-09 21:17 * @Description: * @version: 1.0 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s1 = sc.nextLine(); String s2 = sc.nextLine(); int ans = recursion(s1, s2, s1.length(), s2.length()); System.out.println(ans); } private static int recursion(String s1, String s2, int i, int j) { //由s1 --> s2 if (j == 0) { return i; } else if (i == 0) { return j; } else if (s1.charAt(i-1) == s2.charAt(j - 1)) {//跳过 return recursion(s1, s2, i - 1, j - 1); } else { int m1 = recursion(s1, s2, i - 1, j) + 1;//删掉一个字符 int m2 = recursion(s1, s2, i, j - 1) + 1;//增加一个字符 int m3 = recursion(s1, s2, i - 1, j - 1) + 1;//替换一个字符 return Math.min(Math.min(m1, m2), m3); } } }2.动态规划解法
import java.util.Scanner; /** * @Author: coderjjp * @Date: 2020-05-09 21:17 * @Description: * @version: 1.0 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s1 = sc.nextLine(); String s2 = sc.nextLine(); int ans = dynamicPlanning(s1, s2); System.out.println(ans); } private static int dynamicPlanning(String s1, String s2){ int len1 = s1.length(); int len2 = s2.length(); int dp[][] = new int[len1+1][len2+1]; for (int j = 1; j <= len2; j++) dp[0][j] = j; for (int i = 1; i <= len1; i++) dp[i][0] = i; for (int i = 1; i <= len1; i++) for (int j = 1; j <= len2; j++){ if (s1.charAt(i - 1) == s2.charAt(j - 1)) dp[i][j] = dp[i-1][j-1]; else dp[i][j] = Math.min(Math.min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1; } return dp[len1][len2]; } }