ধরুন আমাদের একটি স্ট্রিং s এবং আরেকটি সংখ্যা k; প্রদত্ত স্ট্রিংটি কে-প্যালিনড্রোম কিনা তা আমাদের পরীক্ষা করতে হবে।
একটি স্ট্রিংকে কে-প্যালিনড্রোম বলা হয় যদি এটি থেকে সর্বাধিক k অক্ষর সরিয়ে একটি প্যালিনড্রোমে রূপান্তরিত করা যায়।
সুতরাং, যদি ইনপুটটি s ="abcdeca", k =2 এর মত হয়, তাহলে আউটপুট সত্য হবে যেমন 'b' এবং 'e' অক্ষর মুছে দিলে তা হবে প্যালিনড্রোম।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি ফাংশন lcs() সংজ্ঞায়িত করুন, এটি s, t,
লাগবে -
n :=s
এর আকার -
s
এর আগে একটি ফাঁকা স্থান যোগ করুন -
t
এর আগে একটি ফাঁকা স্থান যোগ করুন -
একটি 2D অ্যারে ডিপি আকারের (n + 1) x (n + 1) সংজ্ঞায়িত করুন
-
আরম্ভ করার জন্য i :=1, যখন i <=n, আপডেট করুন (i 1 দ্বারা বাড়ান), −
-
j শুরু করার জন্য :=1, যখন j <=n, আপডেট করুন (j 1 দ্বারা বৃদ্ধি করুন), করুন −
-
dp[i, j] :=সর্বাধিক dp[i - 1, j] এবং dp[i, j - 1]
-
যদি s[i] t[j] এর মত হয়, তাহলে −
-
dp[i, j] :=সর্বাধিক dp[i, j] এবং 1 + dp[i - 1, j - 1]
-
-
-
-
dp[n, n]
ফেরত দিন -
প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -
-
যদি s এর আকার না হয়, তাহলে −
-
প্রত্যাবর্তন সত্য
-
-
x :=ফাঁকা স্থান
-
আরম্ভ করার জন্য i :=s এর আকার, যখন i>=0, আপডেট করুন (i 1 দ্বারা কম করুন), −
-
x :=x + s[i]
-
-
s
এর রিটার্ন সাইজ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int lcs(string s, string t){
int n = s.size();
s = " " + s;
t = " " + t;
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] == t[j])
dp[i][j] = max(dp[i][j], 1 + dp[i - 1][j - 1]);
}
}
return dp[n][n];
}
bool isValidPalindrome(string s, int k) {
if (!s.size())
return true;
string x = "";
for (int i = s.size() - 1; i >= 0; i--)
x += s[i];
return s.size() - lcs(s, x) <= k;
}
};
main(){
Solution ob;
cout << (ob.isValidPalindrome("abcdeca", 2));
} ইনপুট
"abcdeca", 2
আউটপুট
1