section1.3.3

这道又是一道典型的动态规划题。通过对题目的分析,我们可以写出这道题动态规划的算法如下。

		if (chan[i]==chan[i-ans[i-1]-1]){
			ans[i]=ans[i-1]+2;
		}
		else if (chan[i]==chan[i-1]){
			ans[i]=2;
		}
		else {
			ans[i]=1;
		}

接着,我们所需要的就是将原有的输入字符串变成“干净”的字符串,即仅有小写字母的串。做完判断后,再将其还原成原字符串输出即可。代码如下。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char change(char t){
	if (t>='A'&&t<='Z'){
		t=t-'A'+'a';
	}
	return t;
}
int main (){
	freopen ("clafflac.in","r",stdin);
	freopen ("clafflac.out","w",stdout);
	char x[20005],c,chan[20005];
	int max=0,st=0,en=0,ans[20005];
	int i=0,tot=1,cnt=1,k=1;
	while (true){
		c=getchar();
		if(c == EOF){
			break;
		}
		x[tot++]=c;
	}
	x[tot]='\0';
	for (i=1;i<=tot;i++){
		if ((x[i]>='a'&&x[i]<='z')||(x[i]>='A'&&x[i]<='Z')){
			chan[cnt++]=change(x[i]);
		}
	}
	for (i=1;i<=cnt;i++){
		if (chan[i]==chan[i-ans[i-1]-1]){
			ans[i]=ans[i-1]+2;
		}
		else if (chan[i]==chan[i-1]){
			ans[i]=2;
		}
		else {
			ans[i]=1;
		}
		if (ans[i]>max){
			max=ans[i];
			if ((i-(i-ans[i-1]-1))==(en-st)){
				continue;
			}
			st=i-ans[i-1]-1;
			en=i;
		}
	}
	cout<<max<<endl;
	for (i=1;i<=tot;i++){
		if ((x[i]>='a'&&x[i]<='z')||(x[i]>='A'&&x[i]<='Z')){
			k++;
		}
		if (k>st){
			cout<<x[i];
		}
		if (k>en){
			break;
		}
	}
	cout<<endl;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值