สมมติว่าเรามีสตริง s ที่มี 4 ทิศทาง "N", "S", "W" และ "E" แทนเหนือ ใต้ ตะวันตก ตะวันออก เราต้องหาขนาดของสับสตริงสั้นที่สุดที่สามารถแก้ไขได้ เพื่อให้แต่ละทิศทางเกิดขึ้น n/4 ครั้ง โดย n คือขนาดของสตริง s
เช่น ถ้าอินพุตคือ s = "NNSWWESN" ผลลัพธ์จะเป็น 1 ที่นี่ n = 8 ดังนั้น 8/4 = 2 ถ้าเปลี่ยน N ตัวสุดท้ายเป็น E ทุกทิศทางจะมี 2 ครั้ง
ขั้นตอนการแก้ปัญหา
n := ขนาดของ s- ถ้า
n == 0คืนค่า0 quarter := floor(n / 4)count := รายการความถี่ของแต่ละสมาชิกใน starget := แมปใหม่- สำหรับแต่ละคู่
(dir, cnt)ในcount:- ถ้า
cnt > quarterให้target[dir] := quarter - cnt
- ถ้า
- ถ้า
targetว่าง คืนค่า0 left := 0,min_len := inf- สำหรับแต่ละดัชนี
rightและทิศทางdirในs:- ถ้า
dirอยู่ในtargetให้target[dir] += 1 - ในขณะที่
min(target.values()) >= 0:min_len := min(min_len, right - left + 1)- ถ้า
s[left]อยู่ในtargetให้target[s[left]] -= 1,left += 1
- ถ้า
- คืนค่า
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