下面是关于我学习动态规划问题的过程,遇到的题目:
附上这位大佬讲解的有关动态规划的知识点:
原文链接
💀题目描述:
依旧是字符串处理,设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:
- 删除一个字符;
- 插入一个字符;
- 将一个字符改为另一个字符。
对任给的两个字符串A和B,计算出将字符串A变换为字符串B所用的最少字符操作次数。
样例输入
sfdxbqw
gfdgw
样例输出
4
详解->>>点进来
代码如下:
import java.util.*;
public class Test05 {
public static int[][] dp = new int[100][100];
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String s1=sc.nextLine();
String s2=sc.nextLine();
int num=minDistance(s1,s2);
System.out.println(num);
for(int i=0;i<s1.length();i++){
for(int j=0;j<s2.length();j++)
System.out.print(dp[i][j]+" ");
System.out.println();
}
}
public static int minDistance(String s1,String s2){
int n1=s1.length();
int n2=s2.length();
//int[][] dp=new int[n1+1][n2+1];
//初始化
for(int i=1;i<=n2;i++)
dp[0][i]=dp[0][i-1]+1;
for(int j=1;j<=n1;j++)
dp[j][0]=dp[j-1][0]+1;
for(int i=1;i<=n1;i++)
for(int j=1;j<=n2;j++){
//如果s1[i]与s2[j]相等,第i个字符对应的下标是i-1
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-1],dp[i][j-1]),dp[i-1][j])+1;
}//替换:i-1,j-1;插入:i,j-1;删除:i-1,j。
}
return dp[n1][n2];
}
}
sfdxbqw
gfdgw
4
0 1 2 3 4
1 1 2 3 4
2 2 1 2 3
3 3 2 1 2
4 4 3 2 2
5 5 4 3 3
6 6 5 4 4
进程已结束,退出代码0