สมมติว่าเรามีสตริง s ที่มีสี่ทิศทาง "N", "S", "W" และ "E" สำหรับ North, South, West และ East ตามลำดับ เราต้องหาขนาดของสตริงย่อยที่สั้นที่สุดที่เราสามารถอัปเดตได้ โดยแต่ละทิศทางจากสี่ทิศทางจะเกิดขึ้น n/4 ครั้งในแต่ละอัน โดยที่ n คือขนาดของสตริง s
ดังนั้น หากอินพุตเป็นเหมือน s ="NNSWWESN" ผลลัพธ์จะเป็น 1 โดยที่ n คือ 8 ดังนั้น 8/4 จึงเป็น 2 ดังนั้นหากเราเปลี่ยน N สุดท้ายเป็น E ทิศทางทั้งหมดจะมีสองครั้งพี>
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- n :=ขนาดของ s
- ถ้า n เป็น 0 แล้ว
- คืน 0
- ควอเตอร์ :=ชั้นของ (n / 4)
- count :=รายการที่มีความถี่ของแต่ละองค์ประกอบที่มีอยู่ใน s
- เป้าหมาย :=แผนที่ใหม่
- สำหรับแต่ละคู่ (dir, cnt) ในการนับ ทำ
- ถ้า cnt> ไตรมาส แล้ว
- target[dir] :=ไตรมาส - cnt
- ถ้า cnt> ไตรมาส แล้ว
- ถ้าเป้าหมายว่างเปล่า
- คืน 0
- ซ้าย :=0
- min_len :=inf
- สำหรับแต่ละดัชนีขวาและทิศทาง dir ใน s ทำ
- ถ้า dir อยู่ในเป้าหมายแล้ว
- target[dir] :=target[dir] + 1
- ในขณะที่รายการค่าเป้าหมายขั้นต่ำทั้งหมด>=0, ทำ
- min_len :=ขั้นต่ำของ min_len และ (ขวา - ซ้าย + 1)
- ถ้า s[ซ้าย] ในเป้าหมาย แล้ว
- target[s[left]] :=target[s[left]] - 1
- ซ้าย :=ซ้าย + 1
- ถ้า dir อยู่ในเป้าหมายแล้ว
- ส่งคืน min_len
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
from collections import Counter def solve(s): n = len(s) if not n: return 0 quarter = n // 4 count = Counter(s) target = dict() for (dir, cnt) in count.items(): if cnt > quarter: target[dir] = quarter - cnt if not target: return 0 left, min_len = 0, float("inf") for right, dir in enumerate(s): if dir in target: target[dir] += 1 while min(target.values()) >= 0: min_len = min(min_len, right - left + 1) if s[left] in target: target[s[left]] -= 1 left += 1 return min_len s = "NNSWWESN" print(solve(s))
อินพุต
"NNSWWESN"
ผลลัพธ์
1