สมมติว่าเรามีสตริง s เราสามารถแปลงเป็นพาลินโดรมได้โดยการเพิ่มอักขระไว้ข้างหน้า เราต้องหา palindrome ที่สั้นที่สุด ที่เราจะหาข้อมูลนี้ได้ ดังนั้นหากสตริงเป็นเหมือน “abcc” ผลลัพธ์จะเป็น − "ccbabcc"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=ขนาดของ s, s1 :=s, s2 :=s
-
ย้อนกลับสตริง s2
-
s2 :=s ต่อ "#" ต่อ s2
-
กำหนดอาร์เรย์ lps ที่มีขนาดเท่ากับ s2
-
เจ :=0, ผม :=1
-
ในขณะที่ฉัน <ขนาดของ s2 ทำ −
-
ถ้า s2[i] เหมือนกับ s2[j] แล้ว
-
lps[i] :=j + 1
-
เพิ่ม i 1, เพิ่ม j 1
-
-
มิฉะนั้น
-
ถ้า j> 0 แล้ว j :=lps[j - 1]
-
ไม่เช่นนั้นให้เพิ่ม i ขึ้น 1
-
-
-
พิเศษ :=สตริงย่อยของ s จาก lps[ขนาดของ s – 1] ถึง n - lps[ขนาดของ lps - 1])
-
ย้อนกลับพิเศษ
-
ส่งคืน concatenate พิเศษ s
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string shortestPalindrome(string s) {
int n = s.size();
string s1 = s;
string s2 = s;
reverse(s2.begin(), s2.end());
s2 = s + "#" + s2;
vector <int> lps(s2.size());
int j = 0;
int i = 1;
while(i <s2.size()){
if(s2[i] == s2[j]){
lps[i] = j + 1;
j++;
i++;
} else {
if(j > 0){
j = lps[ j - 1];
} else {
i++;
}
}
}
string extra = s.substr(lps[lps.size() - 1], n - lps[lps.size() - 1]);
reverse(extra.begin(), extra.end());
return extra + s;
}
};
main(){
Solution ob;
cout << (ob.shortestPalindrome("abcc"));
} อินพุต
“abcc”
ผลลัพธ์
ccbabcc