สมมติว่าเรามีสตริง s เราต้องหาคำนำหน้าที่มีความสุขที่ยาวที่สุดของ s สตริงเรียกว่าคำนำหน้ามีความสุข หากเป็นคำนำหน้าที่ไม่ว่างเปล่าซึ่งเป็นส่วนต่อท้ายด้วย (ไม่รวมตัวเอง) หากไม่มีคำนำหน้าที่มีความสุขเช่นนั้น ให้คืนค่าสตริงว่าง
ดังนั้น หากอินพุตเป็นเหมือน "มาดาม" ผลลัพธ์จะเป็น "m" ซึ่งมี 4 คำนำหน้าไม่รวมตัวมันเอง เหล่านี้คือ "m", "ma", "mad", "mada" และคำต่อท้าย 4 ตัวเช่น "m", "am", "dam", "adam" คำนำหน้าที่ใหญ่ที่สุดซึ่งต่อท้ายด้วย "m" ด้วย
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน lps() ซึ่งจะใช้เวลา s
-
n :=ขนาดของ s
-
กำหนดขนาดของอาร์เรย์ n
-
เจ :=0, ผม :=1
-
ในขณะที่ฉัน
-
ถ้า s[i] เหมือนกับ s[j] แล้ว
-
ret[i] :=j + 1
-
(เพิ่ม i ขึ้น 1)
-
(เพิ่มขึ้น j โดย 1)
-
-
มิฉะนั้นเมื่อ s[i] ไม่เท่ากับ s[j] ดังนั้น −
-
ถ้า j> 0 แล้ว −
-
j :=ret[j - 1]
-
-
มิฉะนั้น
-
(เพิ่ม i ขึ้น 1)
-
-
-
-
รีเทิร์น
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
n :=ขนาดของ s
-
ถ้า n เท่ากับ 1 แล้ว −
-
ส่งคืนสตริงว่าง
-
-
กำหนดอาร์เรย์ v =lps(s)
-
x :=v[n - 1]
-
ret :=สตริงว่าง
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
ret :=ret + s[i]
-
-
รีเทิร์น
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: vector <int> lps(string s){ int n = s.size(); vector<int> ret(n); int j = 0; int i = 1; while (i < n) { if (s[i] == s[j]) { ret[i] = j + 1; i++; j++; } else if (s[i] != s[j]) { if (j > 0) j = ret[j - 1]; else { i++; } } } return ret; } string longestPrefix(string s) { int n = s.size(); if (n == 1) return ""; vector<int> v = lps(s); int x = v[n - 1]; string ret = ""; for (int i = 0; i < x; i++) { ret += s[i]; } return ret; } }; main(){ Solution ob; cout << (ob.longestPrefix("madam")); }
อินพุต
"madam"
ผลลัพธ์
m