สมมติว่าเรามีสตริง s และอีกจำนวนหนึ่ง k; เราต้องตรวจสอบว่าสตริงที่กำหนดเป็น K-Palindrome หรือไม่
สตริงเรียกว่า K-Palindrome หากสามารถเปลี่ยนเป็น palindrome ได้โดยการลบอักขระไม่เกิน k ตัว
ดังนั้น หากอินพุตเป็น s ="abcdeca", k =2 เอาต์พุตจะเป็น true เช่นเดียวกับการนำอักขระ 'b' และ 'e' ออก มันจะเป็น palindrome
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน lcs() ซึ่งจะใช้เวลา s, t,
-
n :=ขนาดของ s
-
เติมช่องว่างก่อน s
-
เติมช่องว่างก่อน t
-
กำหนดขนาดอาร์เรย์ 2 มิติหนึ่ง dp (n + 1) x (n + 1)
-
สำหรับการเริ่มต้น i :=1 เมื่อฉัน <=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