문제 설명
크기가 'n'인 문자열이 주어집니다. 작업은 문자열 회문을 만들기 위해 최소 문자 수를 삭제하는 것입니다.
주어진 문자열이 "abcda"이면 첫 번째와 마지막을 제외한 2개의 문자를 삭제하여 회문으로 만들 수 있습니다.
-
문자 'b'와 'c'를 삭제하면 "ada" 문자열은 회문입니다.
-
문자 'c'와 'd'를 삭제하면 "aba" 문자열은 회문입니다.
-
문자 'b'와 'd'를 삭제하면 "aca" 문자열은 회문입니다
알고리즘
1. Find longest palindromic subsequence of given string. Let’s call it as “lpsSize”. 2. Minimum characters to be deleted = (length of string – lpsSize) Code.
예시
#include <iostream> #include <algorithm> using namespace std; int lps(string s, int i, int j){ if (i == j) { return 1; } if (s[i] == s[j] && i + 1 == j) { return 2; } if (s[i] == s[j]) { return lps(s, i + 1, j - 1) + 2; } return max(lps(s, i, j - 1), lps(s, i + 1, j)); } int minDeletion(string s){ int n = s.size(); int lpsSize = lps(s, 0, n); return (n - lpsSize); } int main(){ cout << "Minimum characters to be deleted = " << minDeletion("abcda") << endl; return 0; }
출력
위의 프로그램을 컴파일하고 실행할 때. 다음 출력을 생성합니다 -
Minimum characters to be deleted = 2