SCAU 2020新生赛C题

(第一篇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;	
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值