题目描述
小施和小唐两个同学近来对字符串操作很感兴趣。小施和小唐各自给了一个字符串,分别记作S和T。如果能通过魔法转换使小施的串和小唐的串变成同一个,那么他们两个人都会很开心。这里的魔法指的是小施的串可以任意删掉某个字符或者替换某个字符。通过这两种方式。如将401变为415,可通过将401中的1替换为5得405,然后将0替换为1得415,需2次修改。
现在给定长度至多为200的两个字符串S和T,你的任务是计算将字符串S变为字符串T的删除和替换的最少总次数。
输入
每组有2行,每行上有1个长度不超过200的字符串,字符串中不含空格。
输出
对输入中的每组测试数据,求出该组中第一行的字符串变为第二行的字符串B所需的删除与替换的最少总次数。
样例输入
输入样例1
32134
23
输入样例2
43010
4014
样例输出
输出样例1
3
输出样例2
2
计算一个字符串变为另一个字符串的最少总次数,望采纳
public int minDistance(String word1, String word2) {
int n = word1.length();
int m = word2.length();
// 有一个字符串为空串
if (n * m == 0) {
return n + m;
}
// DP 数组
int[][] D = new int[n + 1][m + 1];
// 边界状态初始化
for (int i = 0; i < n + 1; i++) {
D[i][0] = i;
}
for (int j = 0; j < m + 1; j++) {
D[0][j] = j;
}
// 计算所有 DP 值
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < m + 1; j++) {
int left = D[i - 1][j] + 1;
int down = D[i][j - 1] + 1;
int left_down = D[i - 1][j - 1];
if (word1.charAt(i - 1) != word2.charAt(j - 1)) {
left_down += 1;
}
D[i][j] = Math.min(left, Math.min(down, left_down));
}
}
return D[n][m];
}
不会是杉达的吧
#include<stdio.h>
#include<string.h>
#define Max 'W'
int test(char *S,char*T,int len1,int len2);
int main() {
int sum;
static char S[] = { "19448365424" };
static char T[] = { "41447645" };
int len1 = strlen(S);
int len2 = strlen(T);
sum = test(S, T, len1, len2);
printf("删除与替换的最少总次数为:%d",sum);
return 0;
}
int test(char *S,char *T,int len1,int len2) {
int unswap = 0;
int swap = 0;
int delet = 0;
delet = len1 - len2;//S的长度减轻T的长度即为最少需要删除的次数
printf("最少需要删除的次数为:%d\n", delet);
for (int i = 0; i < len2; i++) {
for(int j=0;j<len1;j++)
if (T[i] == S[j])
{
S[j] = Max;//可自己随意定,只需字符串中未出现的元素即可,建议用宏,便于修改
unswap++;//计算需要替换的次数每次需要遍历数组n个元素,而计算出不需要替换的次数每次需要遍历数组元素小于等于n
break;
}
}
swap = len2 - unswap;//swap为T长度减去不需要替换的元素个数
printf("替换的最小次数为:%d\n", swap = len2 - unswap);
return len2-unswap + delet;
}