Cho chuỗi chữ thường s. Phân đoạn s thành nhiều mảnh nhất có thể sao cho mỗi chữ cái chỉ xuất hiện trong tối đa 1 mảnh. Trả về danh sách độ dài các mảnh.
Ví dụ: s = "momoplaykae" → [4, 1, 1, 4, 1] (phân đoạn: ["momo", "p", "l", "ayka", "e"]).
Giải thuật (Stack + Đếm tần suất)
- Đếm tần suất mỗi ký tự trong
s. - Duyệt từng ký tự
char:- Giảm count[char], tăng
length. - Dùng stack theo dõi các ký tự "chưa đóng" (vẫn còn xuất hiện sau).
- Khi
count[char] == 0và stack rỗng → cắt đoạn, lưulength, resetlength = 0.
- Giảm count[char], tăng
Ví dụ minh họa
from collections import Counter
class Solution:
def solve(self, s):
count = Counter(s)
out = []
stk = []
length = 0
for char in s:
count[char] -= 1
length += 1
while count[char] != 0 or stk:
if count[char] != 0:
stk.append(char)
break
if stk and count[stk[-1]] == 0:
stk.pop()
else:
break
if not stk and count[char] == 0:
out.append(length)
length = 0
return out
ob = Solution()
s = "momoplaykae"
print(ob.solve(s)) # Output: [4, 1, 1, 4, 1]
Đầu vào / Đầu ra
Input: "momoplaykae"
Output: [4, 1, 1, 4, 1]