Нахождение самого большого палиндрома в строковой реализации

Я пытаюсь решить задачу, которая требует найти самый большой палиндром в строке длиной до 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

EDIT:

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;
        }
    }
}

Хорошо, я исправил проблемы, он работает отлично, но только если длина преобразованной строки нечетная. Пожалуйста, помогите.

5
задан Constantin 11 June 2014 в 08:19
поделиться