Giả sử chúng ta có một chuỗi chữ thường s, chúng ta có thể phân chia s thành nhiều phần nhất có thể sao cho mỗi chữ cái xuất hiện trong nhiều nhất một phần và tìm kích thước của các phân vùng dưới dạng danh sách.
Vì vậy, nếu đầu vào là s ="momoplaykae", thì đầu ra sẽ là [4, 1, 1, 4, 1], vì chuỗi được chia thành ["momo", "p", "l", " ayka "," e "].
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
count:=một bản đồ chứa các ký tự trong s và số lần xuất hiện của chúng
-
out:=một danh sách mới, stk:=một ngăn xếp trống
-
chiều dài:=0
-
đối với mỗi ký tự trong s, thực hiện
-
count [char]:=count [char] - 1
-
length:=length + 1
-
trong khi số [char] không giống 0 hoặc stk không trống, hãy làm
-
nếu số lượng [char] không giống 0, thì
-
đẩy char vào stk
-
đi ra từ vòng lặp
-
-
nếu stk không trống và số lượng [top of stk] bằng 0 thì
-
bật ra từ stk
-
-
nếu không,
-
đi ra từ vòng lặp
-
-
-
nếu stk trống và số lượng [char] bằng 0, thì
-
chèn độ dài sau khi ra
-
chiều dài:=0
-
-
-
trả lại
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau đây để hiểu rõ hơn -
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 += [length] length = 0 return out ob = Solution() s = "momoplaykae" print(ob.solve(s))
Đầu vào
"momoplaykae"
Đầu ra
[4, 1, 1, 4, 1]