现在的位置: 首页 > 综合 > 正文

NYOJ132 最长回文子串

2016年09月28日 ⁄ 综合 ⁄ 共 805字 ⁄ 字号 评论关闭

原题链接

容易思虑不周的地方:忘记最长字串为1的情况,此时应输出第一个字母(这题我贡献了7个WA,%>_<%)。

总结一下,预处理确实能带来很大便捷。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define max 5000 + 5

char str[max], buf[max];
int mark[max]; //找到buf数组中的元素对应的str元素的位置
int maxlen, maxl, maxr; //最长子串长度,左标,右标

bool check(int i, int j){
	while(i < j){
		if(buf[i] == buf[j])
			++i, --j;
		else break;
	}
	if(i >= j) return 1;
	return 0;
}

void findMaxlen(){
	int i, j, len;
	len = strlen(buf);
	maxl = maxr = 0;
	for(i = 0, maxlen = 1; i < len; ++i){
		for(j = i + 1; j < len; ++j){
			if(buf[i] == buf[j] && j - i > maxlen
				&& check(i, j)) maxl = i, maxr = j, maxlen = j - i + 1;
		}
	}
}

int main(){
	int n, len, i, j;
	scanf("%d\n", &n);
	while(n--){
		gets(str);
		len = strlen(str);
		for(i = j = 0; i != len; ++i)
			if(isalpha(str[i])) buf[j++] = toupper(str[i]), mark[j-1] = i;;
		buf[j] = '\0';
		findMaxlen();
		for(i = mark[maxl]; i <= mark[maxr]; ++i)
			putchar(str[i]);
		putchar('\n');
	}
	return 0;
}

803584 长木 最长回文子串 Accepted 36 260 C/C++ 04-09 10:18:37

抱歉!评论已关闭.