7-8 最长对称子串 (25 分)

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;
}

猜你喜欢

转载自blog.csdn.net/qq_43382350/article/details/84943707