分析: 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 字符串