Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมค้นหาจำนวนการอัปเดตที่จำเป็นในการทำให้สตริงซ้ำซากจำเจใน Python


สมมติว่าเรามีสตริงตัวพิมพ์เล็กที่มีความยาวเท่ากัน เราต้องหาจำนวนอักขระขั้นต่ำที่ต้องอัปเดตเพื่อให้ตรงกับเงื่อนไขสามข้อต่อไปนี้สำหรับ i ทั้งหมด โดยที่ 0 ≤ i

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

ดังนั้น หากอินพุตเป็น s ="pppxxp" ผลลัพธ์จะเป็น 1 เพราะหากเราเปลี่ยน "p" สุดท้ายเป็น "x" ก็จะเป็นไปตามเงื่อนไข s[i]

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • n :=ขนาดของ s
  • left :=พจนานุกรมที่มีความถี่ของอักขระแต่ละตัวจากครึ่งซ้ายของ s
  • ขวา :=พจนานุกรมที่มีความถี่ของอักขระแต่ละตัวจากครึ่งขวาของ s
  • ตอบ :=น
  • สำหรับการหมุนอักขระแต่ละตัวในตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก ให้ทำ
    • ans :=ขั้นต่ำของ ans และ (n - left[pivot] - right[pivot])
    • ดี :=ผลรวมขององค์ประกอบทั้งหมดที่มีอยู่ใน (left[c] สำหรับแต่ละ c ทางด้านซ้าย if c <=pivot )
    • ดี :=ดี + ผลรวมขององค์ประกอบทั้งหมดที่อยู่ใน right[c] สำหรับแต่ละ c ใน right if c> pivot
    • ans :=ขั้นต่ำของ ans และ (n - ดี)
    • ดี :=ผลรวมขององค์ประกอบทั้งหมดที่อยู่ใน left[c] สำหรับแต่ละ c ทางด้านซ้าย if c> pivot
    • ดี :=ดี + ผลรวมขององค์ประกอบทั้งหมดที่อยู่ใน right[c] สำหรับแต่ละ c ทางด้านขวา if c <=pivot
    • ans :=ขั้นต่ำของ ans และ (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))

อินพุต

"pppxxp"

ผลลัพธ์

1