最長迴文子串

分析: ios

1. 保證讀入的字符串爲一行(不要被空格隔斷),使用fgets(char *s, int count, FILE *stream)函數輸入。 數組

2. 字符串預處理,去除全部的標點和空格,並忽略大小寫,成爲一個新串,同時記錄新串中的字符在原串中的位置; 函數

3. 判斷子串是不是迴文串,設定i爲子串的中間位置,不斷向兩側同時延伸。主要:子串的長度分爲奇數和偶數兩種狀況。 測試

代碼以下: spa

#include <iostream>
#include <cstdio>
#include <cstring>
#include <ctype.h>
using namespace std;
#define LEN 5000 + 10
int main() {

	char str[LEN];
	char s[LEN];
	while (fgets(str, sizeof(s), stdin) != NULL) {

		//字符位置標記數組
		//用於標記s中的字符在str中的位置
		int pos[LEN];
		//原串中最長迴文子串的起止位置
		unsigned begin, end;

		unsigned i, j, index;
		//預處理字符串,去除標點符號等無關字符
		for (i = 0, index = 0; i < strlen(str); i++) {
			if (isalpha(str[i])) {
				s[index] = toupper(str[i]);
				pos[index++] = i;
			}
		}

		for (i = 0; i < index; i++) {
			printf("%d ", pos[i]);
		}
		printf("\n");
		printf("%s\n", s);
		printf("%d\n", strlen(s));
		printf("%d\n", index);

		//檢查字串是不是迴文串
		//從字串中間部分向兩側延伸:子串長度爲奇數,子串長度爲偶數
		//i爲字串中間位置
		unsigned maxLen = 0;
		for (i = 0; i < index; i++) {

			//字串長度爲奇數
			for (j = 0; i - j >= 0 && i + j < index; j++) {
				if (s[i - j] != s[i + j]) {
					break;
				}
				if (j * 2 + 1 > maxLen) {
					maxLen = j * 2 + 1;
					begin = pos[i - j];
					end = pos[i + j];
				}
			}

			//字串長度爲偶數
			for (j = 0; i - j >= 0 && i + j + 1 < index; j++) {
				if (s[i - j] != s[i + j + 1]) {
					break;
				}
				if (j * 2 + 2 > maxLen) {
					maxLen = j * 2 + 2;
					begin = pos[i - j];
					end = pos[i + j + 1];
				}
			}

		}

		for (i = begin; i <= end; i++) {
			printf("%c", str[i]);
		}
		printf("\n");
		printf("%d\n", (end - begin + 1));

		fflush(stdout);
	}
	return 0;
}



測試數據:


輸入:xiaomanzhu says:Madam,I'm Adam code

輸出:Madam,I'm Adam 字符串

相關文章
相關標籤/搜索