Я прошел 2 вопроса - 1. Найти минимальное количество вставок, необходимое для создания струнного палиндрома? 2. Найти минимальное количество удалений, необходимое для создания строкового палиндрома?
Когда я подошел к нему рекурсивно, оба рекуррентных отношения были одинаковыми, например - «abcda» Вставки 2 (adcbcda), Удаления 2 (aca)
int minCharsToDeletePalindrome(const string& str, int lo, int hi) {
if (lo == hi) {
// Single character is always a palindrome
return 0;
}
if (hi == lo + 1) {
if (str[lo] == str[hi]) {
return 0;
}
// This means there are only characters left now, 2 chars always need only 1 character to delete such they
// become a palindrome.
return 1;
}
if (str[lo] == str[hi]) {
return minCharsToDeletePalindrome(str, lo + 1, hi - 1);
}
else {
// Added one because we have already deleted one character in both the cases.
return min(minCharsToDeletePalindrome(str, lo, hi - 1)
, minCharsToDeletePalindrome(str, lo + 1, hi)) + 1;
}
}
Логически выглядящие они должны быть равны , поскольку удаляемые символы - это символы, которые препятствуют превращению строки в палиндром и, следовательно, если я добавлю те же символы в строку тогда строка должна стать палиндромом, или я могу пойти другим путем.
Итак, правильно ли я понимаю, или есть случаи, когда они не будут равны?