题目 E : Rabbit 的秘密纸条

题目描述 

Rabbit 得到了一张秘密纸条,上面是由密密麻麻的小写字母组成的字符串。

已知,字符 c 与字符'z'-c+'a'是相反的。(即‘a’与‘z’,‘b’与‘y’......)

现在规定对称相反子串的定义为该子串从中间到两边对应位置的字符都是相反的。

例如给定字符串"azza",其对称相反子串有“a”,“z”,“az”,“azz”,"zza","za"。

Rabbit 想知道最长的对称相反子串的长度是多少?

输入 

输入数据第一行为 T,表示数据组数。(1<=T<=10)

每组数据占一行,为字符串 S。(1<=|S|<=1000)

输出 

对于每组数据输出一个整数,代表最长的对称相反子串的长度,占一行。

样例输入

2
kadwxdwz
abcdevdcba

样例输出

7
2

解题思路

这个题是一个签到题,就是遍历一下字符串,然后从两端开始遍历,如果满足str[a] = 'z' - str[b] + 'a',长度就加2,注意要考虑一下aazz和aazzz这种情况。

参考代码

#include <iostream>
#include <algorithm>
using namespace std;

bool isAntisymmetryChar(char a,char b)//判断字符是否对称
{

	if(a == 'z'- b + 'a')
	{
		return true;
	}
	return false;
}

int isAntisymmetryString(int j,int k,string str)//计算对称长度
{
	int len = str.length();
	int l = 0;
	while(j>=0&&k<len)
	{
		if(isAntisymmetryChar(str[j],str[k]))
		{
			l += 2;
		}
		else 
		{
			break;
		}
		j--,k++;
	}
	return l;
}

int main()
{
	int t;
	cin>>t;
	while (t--)
	{
		string str;
		cin >> str;
		int max_len = 0;
		for(int i=0; str[i] != '\0'; i++)
		{
			max_len = max(isAntisymmetryString(i-1,i+1,str) + 1,max_len);//aabzz这种情况
			max_len = max(isAntisymmetryString(i,i+1,str),max_len);//aazz这种情况
			//两种情况取大者
		}
		cout<<max_len<<endl;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

js君

关注我,还有跟多干货

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值