近似回文串 最長回文子串

2021-08-07 05:21:12 字數 1262 閱讀 8511

輸入一行文字,輸出最長近似回文詞連續子串。所謂近似回文詞是指滿足以下條件的字串:

1. s以字母開頭,字母結尾

2. a(s)和b(s)最多有2k個位置不同,其中a(s)是s刪除所有非字母字元並且把所有字母轉化成小寫之後得到的串,b(s)是a(s)的逆序串。

比如當k=1時,race cat是乙個近似回文詞,因為a(s)=racecat和b(s)=tacecar只有2個位置不同。

input

輸入包含不超過25組資料,每組資料報含兩行。第一行是整數k(0<=k<=200),第二行為字串s,包含至少乙個字母但不超過1000個字元(換行符不算)。s只包含字元、空格和其他可列印字元(比如逗號,句號),並且不會以空白字元開頭。

output

對於每組測試資料,輸出最長近似回文子串的長度和起始位置(s的第乙個字元是位置1)。如果有多個最長近似回文子串解,起始位置應盡量小。

sample input

1wow, it is a race cat!

0abcdefg

0kitty: madam, i'm adam.

sample output

case 1: 8 3

case 2: 1 1

case 3: 15 8

該題解題思路類似於求乙個字串的最長回文子串,只是他允許2*k個地方不同。

求最長回文子串的**:

#include #include #include using namespace std;

const int n=1005;

int main()

for(j=0;j<=i&&j+i+1maxlen)

}for(int i=start;i

#include #include #include using namespace std;

const int n=1005;

int main()

}--l;//退回到上一次相同的地方

if(pos[i+l]-pos[i-l]+1>maxlen)//在原字串中的距離大於maxlen

cnt=0;

for(l=0; l<=i&&i+l+1k)

}--l;

if(l<0)

continue;

if(pos[i+l+1]-pos[i-l]+1>maxlen)

}printf("case %d: %d %d\n",cas++,maxlen,start+1);

}return 0;

}

最長回文子串 最長回文子串行

1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...

最長回文子串

描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000,且單獨佔一行 如果...

最長回文子串

輸入乙個字元,求出其中最長的回文子串。子串的含義是 在元串中連續出現的字串片段。回文的含義是 正看和倒看相同,如abba和yyxyy,在判斷時候應該忽略所有的空格和標點符號,且忽略大小寫,但輸出應該保持原樣,輸入的字元長度不超過5000,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...