码迷,mamicode.com
首页 > 其他好文 > 详细

字符串的修改

时间:2020-05-16 12:17:57      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:使用   长度   abc   ber   i++   clu   ++   现在   c++   

题面:

【问题描述】
有 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;
}

  

字符串的修改

标签:使用   长度   abc   ber   i++   clu   ++   现在   c++   

原文地址:https://www.cnblogs.com/114514-px/p/12899687.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!