7-8 最长对称子串 (25 分)
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
作者: 陈越
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB
我的思路我想到两种方法,一种是通过嵌套循环去进行计算最长对称子串的长度
1)就是用for循环从1开始循环到字符串母串的总长度,每种长度都是可能的对称长度
第二种思路就是通过函数先判断是否为对称子串再来比较长度
总结:时间复杂度应该是差不多的,但是思路的话运用函数会比较简单一下
函数方法如下
#include<stdio.h>
#include<string.h>
int symmetric(char *s,int m,int n){
int i;
for(i=0;i<n-m+1;i++){
if(*(s+m+i)!=*(s+n-i)){
return 0;//如果不对称返回值就直接是零了
}
}
return 1; //说明对称
}
int main(){
char str[1001];
gets(str);
int i;
int j;
int max = 1;
int n = strlen(str);
for( i=0; i<n; i++){
for( j=i+1; j<n; j++){//一个子串一个字符也算对称所以直接从i+1开始就行了,减少循环次数
if(symmetric(str,i,j)&&(j-i+1)>max){
max = j-i+1;
}
}
}
printf("%d",max);
return 0;
}
循环嵌套的解答
#include <stdio.h>
#include <string.h>
#define MAXS 1001
int main(void) {
char input[MAXS], result[MAXS];
int str_length, i, j, k, max_length = 0;
gets(input);
str_length = strlen(input);
for (i = 1; i <= str_length; i++) { //对所有可能的长度进行测试
for (j = 0; j < str_length + 1 - i; j++) {
for (k = 0; k < i / 2; k++) {
if (input[j + k] != input[j + i - k - 1]) {
break;
}
}
if (k < i / 2) {
continue;
}
else {
max_length = i;
}
}
}
printf("%d\n", max_length);
return 0;
}