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

โปรแกรมนับจำนวนสตริงย่อยที่เป็นเนื้อเดียวกันใน Python


สมมติว่าเรามีสตริง s เราต้องหาจำนวนสตริงย่อยที่เป็นเนื้อเดียวกันของ s คำตอบอาจมีขนาดใหญ่มาก ดังนั้นให้ส่งคืนโมดูโลคำตอบ 10^9+7 กล่าวกันว่าสตริงเป็นเนื้อเดียวกันเมื่ออักขระทั้งหมดของสตริงเหมือนกัน

ดังนั้น หากอินพุตเป็น s ="xyyzzzzxx" ผลลัพธ์จะเป็น 13 เนื่องจากสตริงย่อยที่เป็นเนื้อเดียวกันมีการระบุไว้เช่น

  • 1."x" ปรากฏขึ้นสามครั้ง

  • "xx" ปรากฏขึ้นหนึ่งครั้ง

  • 3. "y" ปรากฏขึ้นสองครั้ง

  • "ปปปป" ปรากฏขึ้นหนึ่งครั้ง

  • 5. "z" ปรากฏขึ้นสามครั้ง

  • "zz" ปรากฏขึ้นสองครั้ง

  • "zzz" ปรากฏขึ้นหนึ่งครั้ง

ดังนั้น (3 + 1 + 2 + 1 + 3 + 2 + 1) =13

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

  • s :=s ต่อ "@"

  • h:=แผนที่ใหม่

  • ก่อนหน้า:=s[0]

  • ค:=1

  • สำหรับแต่ละ i ใน s จากดัชนี 1 ถึงจุดสิ้นสุด ทำ

    • ถ้าก่อนหน้าไม่เหมือนกับ i แล้ว

      • ถ้า prev*c มีอยู่ใน h แล้ว

        • h[prev*c] :=h[prev*c] + 1

      • มิฉะนั้น

        • h[prev*c]:=1

      • ค:=1

    • ถ้าก่อนหน้าเหมือนกับ i แล้ว

      • ค :=ค + 1

    • ก่อนหน้า :=ฉัน

  • fin:=0

  • สำหรับแต่ละ i ใน h ทำ

    • t:=ขนาดของ i

    • k:=0

    • ในขณะที่ t ไม่เหมือนกับ 0 ทำ

      • k :=k + t

      • t :=t - 1

    • fin :=fin + k*h[i]

  • กลับ fin mod 10^9+7

ตัวอย่าง

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

def solve(s):
   s+="@"
   h={}
   prev=s[0]
   c=1
   for i in s[1:]:
      if prev!=i:
         if prev*c in h:
            h[prev*c]+=1
         else:
            h[prev*c]=1
         c=1
      if prev == i:
         c += 1
      prev = i
   fin=0
   for i in h:
      t=len(i)
      k=0
      while t!=0:
         k+=t
         t-=1
      fin+=k*h[i]
   return fin % 1000000007

s = "xyyzzzxx"
print(solve(s))

อินพุต

"xyyzzzxx"

ผลลัพธ์

13