最大 20,000 文字の文字列で最大の回文を見つけるよう求める問題を解決しようとしています。すべての部分文字列が回文であるかどうかを確認しようとしましたが、うまくいきましたが、明らかに遅すぎました。少しグーグルした後、私はこの素晴らしいアルゴリズム http://stevekrenzel.com/articles/longest-palnidromeを見つけました。私はそれを実装しようとしましたが、動作させることができません。また、指定された文字列には不正な文字が含まれているため、それを有効な文字のみに変換し、すべての文字で最も長い回文を出力する必要があります。
これが私の試みです:
int len = original.length();
int longest = 0;
string answer;
for (int i = 0; i < len-1; i++){
int lower(0), upper(0);
if (len % 2 == 0){
lower = i;
upper = i+1;
} else {
lower = i;
upper = i;
}
while (lower >= 0 && upper <= len){
string s2 = original.substr(lower,upper-lower+1);
string s = convert(s2);
if (s[0] == s[s.length()-1]){
lower -= 1;
upper += 1;
} else {
if (s.length() > longest){
longest = s.length();
answer = s2;
}
break;
}
}
}
私はそれを機能させることができません.紙の上でこの正確なアルゴリズムを使用しようとしましたが、うまくいきました.助けてください. 必要な場合の完全なコードは次のとおりです。http://pastebin.com/sSskr3GY
編集:
int longest = 0;
string answer;
string converted = convert(original);
int len = converted.length();
if (len % 2 == 0){
for (int i = 0; i < len - 1; i++){
int lower(i),upper(i+1);
while (lower >= 0 && upper <= len && converted[lower] == converted[upper]){
lower -= 1;
upper += 1;
}
string s = converted.substr(lower+1,upper-lower-1);
if (s.length() > longest){
longest = s.length();
answer = s;
}
}
} else {
for (int i = 0; i < len; i++){
int lower(i), upper(i);
while (lower >= 0 && upper <= len && converted[lower] == converted[upper]){
lower -= 1;
upper += 1;
}
string s = converted.substr(lower+1,upper-lower-1);
if (s.length() > longest){
longest = s.length();
answer = s;
}
}
}
わかりましたので、問題を修正しました。完全に正常に動作しますが、変換された文字列の長さが奇数の場合のみです。助けてください。