字符串的修改

题面:

【问题描述】
有 A=a1a2a3„am,B=b1b2b3„bn 两个字符串(均为小写字母)现在要通过以下操作将 A
或 A 的一个后缀修改为 B:
1. 删除 删除掉 A 中的某一个字符。
2. 添加 将某一个字符添加到 A 中任意位置。
3. 替换 将 A 中某一字符替换为另一个。
求出最小操作次数。
【输入格式】
第一行为字符串 A。第二行为字符串 B(长度均不超过 1000)。
【输出格式】
一个正整数,最小操作次数。
【样例输入】
aaab
aabc
【样例输出】
1
【提示】
1 次操作 使用后缀 aab 在末尾插入 c。
 
 3种操作都是对字符串的修改 所以可以考虑动态规划 状态数组是二维数组 a[i][j] ,[i]表示A的第i位 [j]表示B的第[j]位 a[i][j] 表示在A[i]和B[j]时的最小操作数
因为是3种操作 每一种操作都可以对应一种转移方式 而要求操作数最小 所以转移方程为:a[i][j]=min(a[i-1][j-1]+A[i-1]==B[i-1],a[i-1][j]+1,a[i][j-1]+1);
代码:
#include<bits/stdc++.h>
int a[1026][1026];
int main()
{
	char A[1025],B[1025];
  int k=1,i1,j1,temp;
  for(int i=1;i<=1000;i++)
  {
	 a[0][i]=k;a[i][0]=k++;
  }
  scanf("%s %s",A,B);
  i1=strlen(A);
  j1=strlen(B);
  for(int i=1;i<=i1;i++)
    for(int j=1;j<=j1;j++)
    {
      a[i][j]=min(a[i-1][j-1]+A[i-1]==B[j-1],min(a[i-1][j]+1,a[i][j-1]+1));
    }
  printf("%d",a[i1][j1]);
  return 0;
}

  

posted @ 2020-05-16 11:40  禁止右转  阅读(424)  评论(0编辑  收藏  举报