Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình tìm bao nhiêu bản cập nhật cần thiết để làm cho chuỗi đơn điệu một nửa trong Python

Giả sử chúng ta có một chuỗi chữ thường s có độ dài là chẵn. Chúng ta phải tìm số ký tự tối thiểu cần được cập nhật sao cho một trong ba điều kiện sau được thỏa mãn với mọi i, trong đó 0 ≤ i

  • s [i]> s [j]
  • s [i]
  • s [i] ==s [j]

Vì vậy, nếu đầu vào là s =​​"pppxxp", thì đầu ra sẽ là 1 vì nếu chúng ta thay đổi "p" cuối cùng thành "x", thì điều này có thể thỏa mãn điều kiện s [i]

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • n:=kích thước của s
  • left:=một từ điển chứa tần số của từng ký tự từ nửa bên trái của s
  • right:=một từ điển chứa tần số của mỗi ký tự từ nửa bên phải của s
  • ans:=n
  • đối với mỗi ký tự xoay vòng trong các chữ cái tiếng Anh viết thường, hãy thực hiện
    • ans:=tối thiểu ans và (n - left [pivot] - right [pivot])
    • good:=tổng của tất cả các phần tử có trong (left [c] cho mỗi c trong left nếu c <=pivot)
    • good:=good + tổng tất cả các phần tử có trong right [c] cho mỗi c trong right nếu c> pivot
    • ans:=tối thiểu ans và (n - tốt)
    • good:=tổng tất cả các phần tử có trong left [c] cho mỗi c ở left if c> pivot
    • good:=good + tổng tất cả các phần tử có trong right [c] cho mỗi c trong right nếu c <=pivot
    • ans:=tối thiểu ans và (n - tốt)
  • trả lại ans

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

from collections import Counter
from string import ascii_lowercase
def solve(s):
   n = len(s)
   left = Counter(s[: n >> 1])
   right = Counter(s[n >> 1 :])

   ans = n
   for pivot in ascii_lowercase:
      ans = min(ans, n - left[pivot] - right[pivot])

      good = sum(left[c] for c in left if c <= pivot)
      good += sum(right[c] for c in right if c > pivot)
      ans = min(ans, n - good)

      good = sum(left[c] for c in left if c > pivot)
      good += sum(right[c] for c in right if c <= pivot)
      ans = min(ans, n - good)

   return ans

s = "pppxxp"
print(solve(s))

Đầu vào

"pppxxp"

Đầu ra

1