輸入一行文字,輸出最長近似回文詞連續子串。所謂近似回文詞是指滿足以下條件的字串:
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,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...