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

ค้นหาสตริงย่อย K-Length ที่ไม่มีอักขระซ้ำใน Python


สมมติว่าเรามีสตริง S เราต้องหาจำนวนสตริงย่อยที่มีความยาว K โดยที่ไม่มีอักขระซ้ำ ดังนั้นถ้า S =“heyfriendshowareyou” และ K คือ 5 ผลลัพธ์จะเป็น 15 เนื่องจากสตริงคือ [heyfr, eyfri, yfrie, frien, riend, iends, endsh, ndsho, dshow, showa, howar, oware, warey, areyo , คุณ]

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

  • สร้างแผนที่ว่างหนึ่งแผนที่ m และซ้าย :=0 และขวา :=-1 และ ans :=0
  • ในขณะที่ขวา <ความยาวของสตริง – 1
    • ถ้าขวา – ซ้าย + 1 =k แล้ว
      • เพิ่ม ans ขึ้น 1
      • ลด m[str[left]] ลง 1
      • เพิ่มขึ้นทางซ้าย 1
      • ไปต่อตอนต่อไป
    • ถ้า str[right + 1] ไม่อยู่ใน m แล้ว
      • set m[str[right + 1]] :=1
      • เพิ่มสิทธิ์ 1
    • ถ้า m[str[right + 1]] เป็น 0 แล้ว
      • เพิ่ม m[str[right + 1]] ขึ้น 1
      • เพิ่มสิทธิ์ 1
    • อย่างอื่น
      • ลด m[str[left]] ลง 1
      • ซ้าย :=ซ้าย + 1
  • ถ้า ขวา – ซ้าย + 1 =k ให้เพิ่ม ans ขึ้น 1
  • คืนสินค้า

ตัวอย่าง

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

class Solution(object):
   def numKLenSubstrNoRepeats(self, S, K):
      m = {}
      left = 0
      right = -1
      ans = 0
      while right<len(S)-1:
         if right - left + 1 == K:
            ans+=1
            m[S[left]]-=1
            left+=1
            continue
         if S[right+1] not in m :
            m[S[right+1]]=1
            right+=1
         elif not m[S[right+1]]:
            m[S[right+1]]+=1
            right+=1
         else:
            m[S[left]]-=1
            left+=1
      if right - left + 1 == K:
         ans+=1
      return ans
ob1 = Solution()
print(ob1.numKLenSubstrNoRepeats("heyfriendshowareyou", 5))

อินพุต

"heyfriendshowareyou"
5

ผลลัพธ์

"AIIOC"