สมมติว่าเรามีสตริงที่เราต้องส่งคืนสตริงย่อยที่ยาวที่สุดเท่าที่จะเป็นไปได้ซึ่งมีอักขระที่ไม่ซ้ำกันจำนวน k ตัว หากมีสตริงย่อยที่มีความยาวมากที่สุดมากกว่าหนึ่งสตริง ให้ส่งคืนสตริงย่อยใดสตริงหนึ่ง
ดังนั้น หากอินพุตเป็น s ="ppqprqtqtqt", k =3 เอาต์พุตจะเป็น rqtqtqt เนื่องจากมีความยาว 7
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ไม่ :=26
-
กำหนดฟังก์ชัน is_ok() นี่จะนับ k
-
ค่า :=0
-
สำหรับผมอยู่ในช่วง 0 ถึง N ทำ
-
ถ้านับ[i]> 0 แล้ว
-
วาล :=วาล + 1
-
-
-
คืนค่าเป็นจริงเมื่อ (k>=val)
-
จากวิธีหลัก ให้ทำดังนี้ −
-
ไม่ซ้ำกัน :=0, ขนาด :=ขนาดของ s
-
count :=อาร์เรย์ขนาด N เติม 0
-
สำหรับผมอยู่ในช่วง 0 ถึงขนาด ทำ
-
ถ้าจำนวน s[i] เท่ากับ 0 แล้ว
-
ไม่ซ้ำกัน :=ไม่ซ้ำกัน + 1
-
-
เพิ่มจำนวน s[i] ขึ้น 1
-
-
ถ้าเฉพาะ
-
ไม่มีตัวละครและทางออกดังกล่าว
-
-
เริ่มต้น :=0, สิ้นสุด :=0
-
window_length :=1, window_start :=0
-
count :=อาร์เรย์ขนาด N เติม 0
-
เพิ่มจำนวน s[0] ขึ้น 1
-
สำหรับผมอยู่ในช่วง 1 ถึงขนาด ทำ
-
เพิ่มจำนวน s[i] ขึ้น 1
-
end :=end + 1
-
ในขณะที่ is_ok(นับ k) เป็นเท็จ ทำ
-
ลดจำนวน s[i] ลง 1
-
start :=start + 1
-
-
ถ้า end-start+1> window_length แล้ว
-
window_length :=end-start+1
-
window_start :=เริ่ม
-
-
-
ส่งคืนสตริงย่อยของ s[จากดัชนี window_start ถึง window_start + window_length]
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
N = 26 def is_ok(count, k): val = 0 for i in range(N): if count[i] > 0: val += 1 return (k >= val) def k_unique_chars(s, k): unique = 0 size = len(s) count = [0] * N for i in range(size): if count[ord(s[i])-ord('a')] == 0: unique += 1 count[ord(s[i])-ord('a')] += 1 if unique < k: return "Not sufficient characters" start = 0 end = 0 window_length = 1 window_start = 0 count = [0] * len(count) count[ord(s[0])-ord('a')] += 1 for i in range(1,size): count[ord(s[i])-ord('a')] += 1 end+=1 while not is_ok(count, k): count[ord(s[start])-ord('a')] -= 1 start += 1 if end-start+1 > window_length: window_length = end-start+1 window_start = start return s[window_start:window_start + window_length] s = "ppqprqtqtqt" k = 3 print(k_unique_chars(s, k))
อินพุต
"ppqprqtqtqt", 3
ผลลัพธ์
rqtqtqt