第一行输入一个长度为
,仅由小写字母组成的字符串
。
第二行输入一个长度为
,仅由小写字母组成的字符串
。
输出一个整数,表示
和
的编辑距离。
abcdefg abcdef
1
在这个样例中,可以选择将
末尾的
删除。当然,也可以选择在
末尾插入
。
#include <stdio.h>
#include <string.h>
//动态规划
int main() {
char A[1000]={0},B[1000]={0};
int lenA=0,lenB=0;
scanf("%s\n%s", A, B);
lenA = strlen(A);
lenB = strlen(B);
//构建一个dp表格来计算最短次数问题
char AB[1000][1000];
int ABnum[1001][1001]={0};
//第0行从第1列开始放入A里面的每一个字符,第0列从第1行开始放入B里面的每一个字符
AB[0][0] = '0';
for(int i=1; i<strlen(A)+1; i++)
AB[0][i] = A[i-1];
for(int i=1; i<strlen(B)+1; i++)
AB[i][0] = B[i-1];
//然后填入初始的数值,也就是第1行第1列开始结尾遍历,如果是有遇到相同字符,就可以少加一次1.标志置0
int equal=1,row=0,list=0;
for(int i=1; i<strlen(A)+1; i++)
{
if(AB[1][0] == AB[0][i] && equal == 1)
{
equal = 0;
row--;
}
ABnum[1][i] = ++row;
}
//类似的,填入第一列的数字
equal = 1;
for(int i=1; i<strlen(B)+1; i++)
{
if(AB[0][1] == AB[i][0] && equal == 1)
{
equal = 0;
list--;
}
ABnum[i][1] = ++list;
}
//进行剩下表格的填入,检查每一次填入的表格的上方和左方的数以及左上(这个是为了检查能不能代替),填入加一以后较小的那个数,如果新的字符与表格相同的话填入左斜上方的数
for(int i=2; i<lenB+1; i++)
{
for(int j=2; j<lenA+1; j++)
{
if(AB[0][j] == AB[i][0])
ABnum[i][j] = ABnum[i-1][j-1];
else
{
ABnum[i][j] = (ABnum[i-1][j]<ABnum[i][j-1])?(ABnum[i-1][j]+1):(ABnum[i][j-1]+1);
ABnum[i][j] = (ABnum[i][j]<(ABnum[i-1][j-1]+1))?(ABnum[i][j]):(ABnum[i-1][j-1]+1);
};
}
}
printf("%d", ABnum[lenB][lenA]);
return 0;
}
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define N 1001
int min(int a, int b, int c)
{
int temp;
temp = (a < b) ? a : b;
temp = (temp < c) ? temp : c;
return temp;
}
int main()
{
char a[N] = {0};
char b[N] = {0};
scanf("%s", a);
scanf("%s", b);
int lenA = strlen(a);
int lenB = strlen(b);
// 1.建立二维数组
int twoArrays[lenA+1][lenB+1];
// 2.数据初始化
for(int i = 0; i < lenA+1; i++){
for(int j = 0; j < lenB+1; j++){
if(i == 0 && j != 0){
twoArrays[i][j] = j;
}else if(i != 0 && j == 0){
twoArrays[i][j] = i;
}else{
twoArrays[i][j] = 0;
}
}
}
// 通过状态方程填补数据
for(int i = 1; i < lenA+1; i++){
for(int j = 1; j < lenB+1; j++){
if(a[i-1] == b[j-1]){
twoArrays[i][j] = twoArrays[i-1][j-1];
}else{
int add = twoArrays[i][j-1] + 1; // 删除一个
int del = twoArrays[i-1][j] + 1; // 增加一个(增加、删除其实一样)
int replace = twoArrays[i-1][j-1] + 1; // 替换一个
twoArrays[i][j] = min(add, del, replace);
}
}
}
printf("%d\n", twoArrays[lenA][lenB]);
return 0;
} #include <stdio.h>
#include <string.h>
int min(int a, int b){
return a<b? a:b;
}
int main() {
char a[1001] = {};
char b[1001] = {};
int dp[1001][1001] = {0}; //dp[i][j]表示长度为i、j的字符串之间的编辑距离
scanf("%s", a);
scanf("%s", b);
int len1 = strlen(a);
int len2 = strlen(b);
for(int i=1; i<=len1; i++) //初始化dp[i][j],并将字符右移一个单位,0号位存空字符
{
dp[i][0] = i; //表示由空字符串转化成长度为i的字符串所需的编辑次数
a[len1-i+1] = a[len1-i];
}
for(int j=1; j<=len2; j++)
{
dp[0][j] = j;
b[len2-j+1] = b[len2-j];
}
a[0]=b[0]=' ';
for(int i=1; i<=len1; i++)
{
for(int j=1; j<=len2; j++)
{
/*状态转移方程为:
1、dp[i][j] = dp[i-1][j] + 1; //表示从a中增加一个字符
2、dp[i][j] = dp[i][j-1] + 1; //表示从b中增加一个字符
3、dp[i][j] = dp[i-1][j-1] + 1; //表示a[i]替换成b[j](a[i] != b[j])
4、dp[i][j] = dp[i-1][j-1] //a[i] == b[j],不需要替换
取四种情况的最小值
*/
if(a[i] == b[j])
dp[i][j] = dp[i-1][j-1];
else
{
dp[i][j] = dp[i-1][j-1] + 1;
dp[i][j] = min(dp[i][j], dp[i-1][j] + 1);
dp[i][j] = min(dp[i][j], dp[i][j-1]+1);
}
}
}
printf("%d", dp[len1][len2]);
return 0;
} #include <stdio.h>
#include <string.h>
#define N 1000
int find_min(int x,int y,int z)
{
if(x<y)
if(x<z)
return x;
else
return z;
else
if(y<z)
return y;
else
return z;
}
int main()
{
char str1[N],str2[N];
scanf("%s%s",str1,str2);
int m=strlen(str1);
int n=strlen(str2);
int dp[N][N],i,j,min;
for(i=0;i<=m;i++)
dp[i][0]=i;
for(j=0;j<=n;j++)
dp[0][j]=j;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
min=find_min(dp[i][j-1],dp[i-1][j],dp[i-1][j-1]);
if(str1[i-1]==str2[j-1])
dp[i][j]=dp[i-1][j-1];
else
dp[i][j]=min+1;
}
}
printf("%d\n",dp[m][n]);
return 0;
} #include<stdio.h>
#include<math.h>
#include<stdlib.h>
int min(int a,int b){
if(a>b) return b;
return a;
}
int max(int a,int b){
if(a<b) return b;
return a;
}
int main(){
//实用动态规划
char str1[502]={0};
while(~scanf("%s",str1))
{
char str2[502]={0};
//gets(str1);
scanf("%s",str2);
strcpy(&str1[1],&str1[0]);
strcpy(&str2[1],&str2[0]);
str1[0]=' ';
str2[0]=' ';
int n=strlen(str1);
int m=strlen(str2);
int d[n][m];
d[0][0]=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(i==0||j==0){
d[i][j]=max(i,j);
continue;
}
if(str1[i]==str2[j]){
int a=d[i-1][j-1];
d[i][j]=a;
continue;
}
//如果对应的字符并不相等的话,有三种操作
//第一种:修改一个字符其值等于d[i-1][j-1]+1
//第二种:删除一个字符其值等于d[i][j-1]+1
//第三种:增加一个字符相当于另一个字符串删除一个字符其值等于d[i-1][j]+1
if(str1[i]!=str2[j]){
int a=d[i-1][j-1]+1;
int b=d[i][j-1]+1;
int c=d[i-1][j]+1;
d[i][j]=min(min(a,b),c);
continue;
}
}
}
printf("%d\n",d[n-1][m-1]);
memset(str1,0,sizeof(char )*501);
}
} #include "stdio.h"
#include "stdlib.h"
#include "string.h"
int main()
{
char str1[1000] = {0};
char str2[1000] = {0};
int len1 = 0;
int len2 = 0;
int i = 0;
while(scanf("%s%s", str1, str2) != EOF)
{
len1 = strlen(str1);
len2 = strlen(str2);
int distance[len2+1][len1+1];
memset(distance, 0, sizeof(int)*(len1+1)*(len2+1));
/*填充距离数组的第1行和第1列*/
for(i=0; i<=len1; i++)
{
distance[0][i] = i;
}
for(i=0; i<=len2; i++)
{
distance[i][0] = i;
}
for(i=1; i<=len2; i++)
{
for(int j=1; j<=len1; j++)
{
if(str1[j-1] == str2[i-1])
{
distance[i][j] = distance[i-1][j-1];
}
else
{
distance[i][j] = ((distance[i-1][j]+1) < (distance[i][j-1]+1)) ? (distance[i-1][j]+1) : (distance[i][j-1]+1);
if((distance[i-1][j-1]+1) < distance[i][j])
distance[i][j] = distance[i-1][j-1]+1;
else ;
}
}
}
printf("%d\n", distance[len2][len1]);
}
return 0;
} #include<stdio.h>
#define len 500
int getmin(int a, int b, int c) {
if(a <= b && a <= c) {
return a;
} else if (b <= a && b <= c) {
return b;
} else if (c <= a && c <= b) {
return c;
} else {
return -1;
}
}
int getLev(char a[len], char b[len]) {
int m = strlen(a);
int n = strlen(b);
int cost = 0, lev[len][len] = {0};
for(int i = 0; i <= m; i++) {
lev[i][0] = i;
}
for(int j = 0; j <= n; j++) {
lev[0][j] = j;
}
for(int i = 1; i <= m; i++) {
for(int j = 1; j <= n; j++) {
if(a[i-1] == b[j-1]) {
lev[i][j] = lev[i-1][j-1];
} else {
lev[i][j] = getmin(lev[i][j-1] + 1, lev[i-1][j] + 1, lev[i-1][j-1] + 1);
}
}
}
return lev[m][n];
}
int main() {
char a[len] = {0};
char b[len] = {0};
while(gets(a) && gets(b)) {
printf("%d\n", getLev(a,b));
}
}