题目描述
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;
}