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

โปรแกรมนับจำนวนอักขระเฉพาะของทุกสตริงย่อยของสตริงใน Python


สมมติว่าเรามีสตริงตัวพิมพ์เล็ก s เราต้องหาผลรวมของการนับอักขระที่แตกต่างกันในทุกสตริงย่อยของ s หากคำตอบมีขนาดใหญ่มาก ให้คืนค่า mod ผลลัพธ์ 10^9+7

ดังนั้น หากอินพุตเป็น s ="xxy" ผลลัพธ์จะเป็น 6 เนื่องจากสตริงย่อยและจำนวนเป็น −

  • "x" :1

  • "x" :1

  • "y" :1

  • "xx" :0 (เนื่องจาก "x" ไม่ต่างกัน)

  • "xy" :2

  • "xxy" :1 ("x" ไม่ต่างกัน)

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

  • ม :=10^9 + 7

  • prev_seen :=แผนที่ใหม่เปล่า

  • ตอบ :=0

  • กำหนดฟังก์ชัน util() นี่จะใช้เวลา i สัญลักษณ์

  • prev_seen[สัญลักษณ์] :=รายการที่มีค่าเดียว -1

  • ก่อนหน้า :=prev_seen[สัญลักษณ์]

  • แทรก i ที่ส่วนท้ายของก่อนหน้า

  • ถ้าขนาดก่อนหน้า> 2 แล้ว

    • ซ้าย :=องค์ประกอบแรกของก่อนหน้าและลบองค์ประกอบแรกจากก่อนหน้า

    • กลาง :=ก่อนหน้า[0], ขวา :=ก่อนหน้า[1]

    • cnt :=(กลาง - ซ้าย) *(ขวา - กลาง)

    • ans :=(ans + cnt) mod m

  • สำหรับแต่ละดัชนี i และสัญลักษณ์ค่าใน s ทำ

    • util(i, สัญลักษณ์)

  • สำหรับแต่ละสัญลักษณ์ใน prev_seen ให้ทำ

    • util(ขนาดของ s , สัญลักษณ์)

  • กลับมาอีกครั้ง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

class Solution:
   def solve(self, s):
      m = 10 ** 9 + 7
      prev_seen = {}
      ans = 0
      def util(i, symbol):
         nonlocal ans
         prev = prev_seen.setdefault(symbol, [−1])
         prev.append(i)
         if len(prev) > 2:
            left = prev.pop(0)
            middle, right = prev
            cnt = (middle − left) * (right − middle)
            ans = (ans + cnt) % m
      for i, symbol in enumerate(s):
         util(i, symbol)
      for symbol in prev_seen:
         util(len(s), symbol)
      return ans
ob = Solution()
s = "xxy"
print(ob.solve(s))

อินพุต

xxy

ผลลัพธ์

6