สมมติว่าเรามีสตริง s เราต้องทำการค้นหาในสตริงย่อยของ s สำหรับแต่ละเคียวรีแบบสอบถาม[i] มีสามส่วน [left, right, k] เราอาจจัดเรียงสตริงย่อยใหม่ s[left], ..., s[right] แล้วเลือกมากถึง k รายการเพื่อแทนที่ด้วย ตัวอักษรภาษาอังกฤษตัวพิมพ์เล็กใด ๆ ถ้าสตริงย่อยเป็นไปได้ที่จะเป็นพาลินโดรมหลังจากการดำเนินการที่กล่าวถึงข้างต้น ผลลัพธ์ของการสืบค้นจะเป็นจริง มิฉะนั้นเท็จ เราต้องหาคำตอบของอาร์เรย์[] โดยที่ answer[i] คือผลลัพธ์ของการสืบค้นที่ i-th[i]
ตัวอย่างเช่น หากอินพุตคือ “abcda” ข้อความค้นหาจะเหมือนกับ [[3,3,0],[1,2,0],[0,3,1],[0,3,2],[0, 4,1]] จากนั้นผลลัพธ์จะเป็น [จริง, เท็จ, เท็จ, จริง, จริง]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดวิธีการที่เรียกว่า Solve ซึ่งจะใช้ dp matrix และ q สิ่งนี้จะทำงานเหมือนด้านล่าง −
- l :=q[0], r :=q[1], k :=q[2] จากนั้นเพิ่ม l และ r ขึ้น 1 หนึ่ง :=0
- สำหรับ i ในช่วง 0 ถึง 25
- หนึ่ง :=หนึ่ง + (dp[r, i] – dp[l – 1, i]) mod 2
- คืนค่า จริง เมื่อหารจำนวนเต็มของ 1 / 2 <=k มิฉะนั้น เท็จ
- กำหนดเมธอดอื่นที่เรียกว่า makeDP() ซึ่งจะใช้เมทริกซ์ dp และ s ซึ่งจะทำงานดังนี้ −
- สำหรับ i ในช่วง 0 ถึงความยาวของ s
- สำหรับ j ในช่วง 0 ถึง 25
- dp[i, j] :=dp[i – 1, j]
- เพิ่ม dp[i, ASCII ของ s[i] – ASCII ของ 'a'] ขึ้น 1
- สำหรับ j ในช่วง 0 ถึง 25
- วิธีการหลักจะเป็นเช่น −
- n :=ขนาดของสตริง s, s :=“ ” ต่อ s
- dp :=เมทริกซ์ของคำสั่ง (n + 1) x 26 และเติมด้วย 0
- โทร makeDP(dp, s)
- res :=อาร์เรย์ที่มีขนาดเท่ากับความยาวของ q และเติมด้วย false
- สำหรับ i ในช่วง 0 ถึงความยาวของ q – 1
- res[i] :=แก้(dp, q[i])
- ผลตอบแทน
ตัวอย่าง(Python)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
class Solution(object): def solve(self,dp,q): l = q[0] r = q[1] k = q[2] r+=1 l+=1 #arr = [ 0 for i in range(26)] one = 0 for i in range(26): one += (dp[r][i]-dp[l-1][i])%2 return one//2<=k def make_dp(self,dp,s): for i in range(1,len(s)): for j in range(26): dp[i][j] = dp[i-1][j] dp[i][ord(s[i])-ord('a')]+=1 def canMakePaliQueries(self, s, q): n = len(s) s = " "+s dp = [[0 for i in range(26)] for j in range(n+1)] self.make_dp(dp,s) res = [False for i in range(len(q))] for i in range(len(q)): res[i] = self.solve(dp,q[i]) return res ob = Solution() print(ob.canMakePaliQueries("abcda", [[3,3,0],[1,2,0],[0,3,1],[0,3,2],[0,4,1]]))
อินพุต
"abcda" [[3,3,0],[1,2,0],[0,3,1],[0,3,2],[0,4,1]]
ผลลัพธ์
[True, False, False, True, True]