สมมติว่าเรามีสตริง 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]