对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?
,最长对称子串为s PAT&TAP s
,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
当时写的时候没有思路。。
代码1:
这是别人的代码,但是我感觉还会有更高效的
#include<stdio.h>
#include<string.h>
int main()
{
char str[1001];
gets(str);
int max,i,j,k,n;
max=1; //最短为1,而不是0
n=strlen(str); //字符串长度
for(i=0;i<=n;i++)
{
for(j=n;j>i;j--)
{
if(str[i]==str[j])
{
for(k=0;i+k<=j-k;k++)
{
if(i+k<j-k)
{
if(str[i+k]==str[j-k])
{
if(i+k+1==j-k) //偶数情况
{
if(max<j-i+1)
max=j-i+1;
}
else
continue;
}
else
break;
}
else{
if(max<j-i+1)
max=j-i+1;
}
}
}
}
}
printf("%d",max);
}
代码2:
这个代码我认为比上一个好理解,而且更高效
这个代码的思路就是我们最后找到的最长对称子串的长度可能是奇数或偶数,代码中的两个for循环就是分别处理奇数和偶数的情况。
设置了两个指针p和q,如果p和q在0--len范围内,我们就判断p和q指向的值是否相等,若相等,则p,q分别向两侧移动,若不等,直接退出。
最后我们在比较一下这次的对称子串是否是最长的,若是,则记录。
#include <iostream>
#include <algorithm>
using namespace std;
char a[1005];
int len;
int main()
{
gets_s(a);
len = strlen(a);
int ans = 1;
for (int i = 1; i < len - 1; i++)//奇数的情况
{
int p = i - 1;
int q = i + 1;
int tmp = 1;
while (p >= 0 && q < len)
{
if (a[p] == a[q])
{
p--;
q++;
tmp += 2;
}
else
{
break;
}
}
if (tmp > ans)
{
ans = tmp;
}
}
for (int i = 0; i < len - 1; i++)//偶数的情况
{
int p = i;
int q = i + 1;
int tmp = 0;
while (p >= 0 && q < len)
{
if (a[p] == a[q])
{
p--;
q++;
tmp += 2;
}
else
{
break;
}
}
if (tmp > ans)
{
ans = tmp;
}
}
printf("%d\n", ans);
return 0;
}
我自己写的版本:(和代码2一样,就是改了几个变量)
#include <iostream>
#include <algorithm>
#include<string>
using namespace std;
int main()
{
int max = 1;
string s;
int length = 0;
getline(cin, s);
length = s.length();
for (int i = 1; i < length; i++) {
int front = i - 1;
int rear = i + 1;
int temp = 1;
while (front >= 0 && rear <= length - 1) {
if (s[front] == s[rear]) {
front--;
rear++;
temp += 2;
}
else {
break;
}
}
if (temp > max) {
max = temp;
}
}
for (int i = 0; i < length; i++) {
int front = i;
int rear = i + 1;
int temp = 0;
while (front >= 0 && rear <= length - 1) {
if (s[front] == s[rear]) {
front--;
rear++;
temp += 2;
}
else {
break;
}
}
if (temp > max) {
max = temp;
}
}
cout << max << endl;
return 0;
}
代码3:
这个应该是代码1的简化版,更好理解
#include<stdio.h>
#include<string.h>
char a[10001];
int judge(int i, int j) {
while (i <= j)
if (a[i++] != a[j--])
return 0;
return 1;
}
int main() {
gets(a);
int maxn = 0;
int len=strlen(a);
for (int i = 0; i <len; ++i)
for (int j =len- 1; j >= i; --j)
if (judge(i, j))
maxn = maxn>(j - i + 1)?maxn:(j-i+1);
printf("%d",maxn);
return 0;
}