কম্পিউটার টিউটোরিয়াল

C++-এ স্ট্রিংকে প্যালিনড্রোম বানাতে ন্যূনতম ইন্সারশন

সমস্যা বিবরণ

একটি স্ট্রিং s দেওয়া থাকলে, যেকোনো পজিশনে ক্যারেক্টার ইন্সার্ট করে সেটিকে প্যালিনড্রোম বানাতে হবে। ন্যূনতম কতটি ইন্সারশন লাগবে তা বের করতে হবে।

উদাহরণ

s = "mad" → আউটপুট = 2 (পূর্বে "da" যোগ করলে "damad" বা পরে "am" যোগ করলে "madam")

সমাধান পদ্ধতি

  • LCS (Longest Common Subsequence) ব্যবহার করা হয়।
  • স্ট্রিং s এবং এর রিভার্স x-এর LCS বের করা হয়।
  • উত্তর = s.length() - LCS(s, reverse(s))।
  • DP টেবিল দিয়ে LCS গণনা করা হয়।

C++ বাস্তবায়ন

#include <bits/stdc++.h>
using namespace std;

class Solution {
    int lcs(string s) {
        string x = s;
        int n = s.size();
        reverse(x.begin(), x.end());
        s = " " + s;
        x = " " + x;
        vector<vector<int>> dp(n + 1, vector<int>(n + 1));
        
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
                if (s[i] == x[j])
                    dp[i][j] = max(dp[i][j], dp[i-1][j-1] + 1);
            }
        }
        return dp[n][n];
    }
    
public:
    int minInsertions(string s) {
        return s.size() - lcs(s);
    }
};

int main() {
    Solution ob;
    cout << ob.minInsertions("mad");
    return 0;
}

ইনপুট ও আউটপুট

ইনপুট: "mad"

আউটপুট: 2

  1. বাইনারি স্ট্রিংকে অল্টারনেটিং করার জন্য ন্যূনতম সোয়াপ (C++)

  2. C++-এ স্ট্রিংকে প্যালিনড্রোম बनाने মিনিমাম অ্যাপেন্ড

  3. C++-এ সব স্ট্রিং সমান করার মিনিমাম মুভ-টু-এন্ড অপারেশন

  4. C++ ব্যবহার করে স্ট্রিংকে প্যালিনড্রোম করার ন্যূনতম ডিলিশন সংখ্যা