迴文算法1(一般實現)

問題

某個字符串$S$的部分字符串(Substring)是指,從字符串$S$中提取連續的部分而構成的字符串。即,$S=$"abcd"字符串存在"abcd","abc", "bcd", "ab", "bc","cd", "a", "b", "c", "d"。同樣,Palindrome是指順讀和倒讀都一樣的詞語。比如,"abcba","abba", "aba"就是Palindrome,但"abcabc" 等則不是Palindrome。給出字符串$S$時,請求出字符串$S$的部分字符串中可以Palindrome的最大長度。

 

輸入

在第一行給出字符串$S$,字符串$S$只能由大寫的羅馬字母構成,長度在$5\,000$ 以內。

輸出

輸出給出的字符串的最長的PalindromeSubstring的長度。

案例輸入

ADEEDCCDEEA

案例輸出

8

 

C++代碼實現

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
char ch1[5000], ch2[10001];
int j = 0;
int maxl = 0;
int getLen(int idx){
 int templ = 1;
 for (; idx + templ <= j && idx - templ >= 0; templ++){
  if (ch2[idx + templ] != ch2[idx - templ]) break;
  //templ++;
 }
 return (templ - 1) / 2;
}
int main(){
 scanf("%s", ch1);
 int ln = strlen(ch1);
 ch2[0] = '#';

 for (int i = 0; i < ln; i++) {
  ch2[++j] = ch1[i];
  ch2[++j] = '#';
 }
 for (int i = 2; i < j - 1; i++){
  int templ = getLen(i);
  templ += templ;
  if (templ>0 && ch2[i] != '#') templ++;
  if (templ>maxl) maxl = templ;
  //  i++;
 }

 printf("%d\n", maxl);

 return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章