สมมติว่าเราได้รับสองสตริง ทั้งสองทำจากอักษรตัวพิมพ์เล็ก เราต้องหาจำนวนสี่เท่า (p, q, r, s) ที่ตรงตามเงื่อนไขที่กำหนด -
-
0 <=p <=q <=ความยาวของสตริงแรก
-
0 <=r <=s <=ความยาวของสตริงที่สอง
-
สตริงย่อยเริ่มต้นที่ดัชนี p ของสตริงแรกและสิ้นสุดที่ดัชนี q ของสตริงแรก ต้องเท่ากับสตริงย่อยที่เริ่มต้นที่ดัชนี q ของสตริงที่สองและสิ้นสุดที่ดัชนี r ของสตริงที่สอง
-
q - r ต้องเป็นค่าต่ำสุดที่เป็นไปได้ภายในสี่เท่าทั้งหมดที่เป็นไปตามข้างต้น
เราต้องหาจำนวนสี่เท่านั้นให้ได้
ดังนั้น หากอินพุตเป็นเหมือน firstString ='hgfn', secondString ='gfrt' ผลลัพธ์จะเป็น 2
มีสองสี่ (1, 1, 0, 0) และ (2, 2, 1, 1) ที่ตรงตามเงื่อนไขและมีค่าต่ำสุดสำหรับ q - r.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดฟังก์ชัน ord() นี่จะใช้เวลา ch
- คืนค่ายูนิโค้ดของ ch
- จากวิธีหลัก ให้ทำดังนี้ -
- ซ้าย :=รายการใหม่ของขนาด 26 ที่มีค่าอินฟินิตี้
- right :=รายการใหม่ของขนาด 26 ที่มีค่า -1
- res :=0
- mi :=อินฟินิตี้
- สำหรับแต่ละดัชนี i และอักขระ ch ใน firstString ให้ทำ
- left[ord(ch) - ord('a') ] :=ขั้นต่ำของ (left[ord(ch) - ord('a') ], i)
- สำหรับแต่ละดัชนี i และอักขระ ch ใน secondString ให้ทำ
- right[ord(ch) - ord('a') ] :=สูงสุดของ right[ord(ch) - ord('a') ], i
- สำหรับฉันในช่วง 0 ถึง 25 ทำ
- ถ้า left[i] ไม่เหมือนกับ -1 แล้ว
- mi :=ขั้นต่ำของ (mi, left[i] - right[i])
- ถ้า left[i] ไม่เหมือนกับ -1 แล้ว
- สำหรับฉันในช่วง 0 ถึง 25 ทำ
- ถ้า left[i] ไม่เหมือนกับอินฟินิตี้ และ right[i] ไม่เหมือนกับ -1 แล้ว
- ถ้า left[i] - right[i] เหมือนกับ mi แล้ว
- res :=res + 1
- ถ้า left[i] - right[i] เหมือนกับ mi แล้ว
- ถ้า left[i] ไม่เหมือนกับอินฟินิตี้ และ right[i] ไม่เหมือนกับ -1 แล้ว
- ผลตอบแทน
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def solve(firstString, secondString):
left = [float('inf')] * 26
right = [-1] * 26
res = 0
mi = float('inf')
for i, ch in enumerate(firstString):
left[ord(ch) - ord('a')] = min(left[ord(ch) - ord('a')], i)
for i, ch in enumerate(secondString):
right[ord(ch) - ord('a')] = max(right[ord(ch) - ord('a')], i)
for i in range(26):
if left[i] != -1:
mi = min(mi, left[i] - right[i])
for i in range(26):
if left[i] != float('inf') and right[i] != -1:
if left[i] - right[i] == mi:
res += 1
return res
print(solve('hgfn', 'gfrt')) อินพุต
'hgfn', 'gfrt'
ผลลัพธ์
2