(第一篇passage)
题目:
有一个长度为N的字符串S和长度为M的字符串T。
可以对串S进行以下三种操作:
1.在其第一个字母前面插入任意一个字母
2.在其最后一个字母后面插入任意一个字母
3.删除其第一个字母
进行尽量少的操作使得S串变成T串,虽然这个问题很简单,但是对于jinli_来说太难了,如果做不出来就要被koo_1999和Fczzz嘲笑,你能帮帮他吗?
1<=N,M<=10000
输入格式
输入有两行,第一行为字符串S,第二行为字符串T,字符串只包含字母
输出格式
输出一个数字,表示将S变为T的最小操作数。
输入样例
cababab
aababab
输出样例
2
提示:透过现象看本质
个人思路:
字符串首部,可以增减,尾部只可以增。由于只能删改首尾,不妨将中间部分看做一个整体,自然想到求最长公共字符串的,然后用S串的长度减去公共字符串长度即为最少的删除字符步骤,再用T串的长度减去公共字符串长度即为最少的增加字符操作。
问了一个师兄的思路:
#include<iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char s1[10001],s2[10001],s3[10001],s4[10001],s5[10001];
int main()
{
int i,first=0,j;
cin>>s1>>s2;
int len1=strlen(s1),len2=strlen(s2);
for(i=0;i<len1;i++) s3[len1-i-1]=s1[i];//s3储存S的倒字符串
for(i=0;i<len2;i++) s4[len2-i-1]=s2[i];//s4储存T的倒字符串
i=0;
int length=0;//记录最长公共字符串的长度
do{
length=strlen(s5);//每次操作都要更新最长字符串长度
s5[i]=s3[i];s5[i+1]='\0';i++;
}while(strstr(s4,s5)&&i<=len1);//从第一个s3的第一个字符开始,在s4中寻找,然后依次叠加一个字符,寻找最长字符串
cout<<len1-length+len2-length<<endl;//最少操作次数==(S的长度减去length)加上(T的长度减去length)
return 0;
}