7-4 最长对称子串 (25分)
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?
,最长对称子串为s PAT&TAP s
,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
思路:
找对称子串,就是比较中心左右两个值是否相等,如果相等,总长度就加2,然后左边像左挪一下右边向右挪一下,若不等了,就向后换个中心继续进行比较,直到遍历完字符串。
需要注意的是,最长对称子串的字符个数是奇是偶不知道,如果是奇数,中心只有一个字符;如果是偶数,中心是两个字符,需要都进行判断去找最长
更新AC代码,更简洁:
#include<bits/stdc++.h>
using namespace std;
int res, tp;
string str;
int main(){
getline(cin, str);
for(int i = 1;i < str.size() - 1;i++){ //奇数个长度
int l = i - 1, r = i + 1;
tp = 1;
while(str[l] && str[r] && str[l] == str[r]) tp += 2, l--, r++;
res = max(tp, res);
}
for(int i = 0;i < str.size() - 1;i++){ //偶数个长度
tp = 0;
int l = i, r = i + 1;
while(str[l] && str[r] && str[l] == str[r]) tp += 2, l--, r++;
res = max(res, tp);
}
if(str.size() == 1) res = 1;
cout << res;
}
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
char str[1010];
cin.get(str,1010); //这样输入可以使字符串里带空格
int length = strlen(str);
int temp,cnt = 1;//cnt为最终长度,至少为1,不是0
for(int i = 0;i < length;i++){ //设字符串为偶数个进行判断
int a,b;
temp = 0;
a = i;
b = i+1;
while(str[a]==str[b] && a>=0 && b < length){
a = a-1;
b = b+1;
temp+=2;
}
if(temp > cnt)
cnt = temp;
}
for(int i = 1;i < length;i++){ //设字符串为奇数个进行判断
int a,b;
temp = 1;
a = i-1;
b = i+1;
while(str[a]==str[b] && a>=0 && b < length){
a = a-1;
b = b+1;
temp+=2;
}
if(temp > cnt)
cnt = temp;
}
cout << cnt;
}