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

ค้นหาสตริงย่อยที่ยาวที่สุดด้วยอักขระที่ไม่ซ้ำกัน k ตัวในสตริงที่กำหนดใน Python


สมมติว่าเรามีสตริงที่เราต้องส่งคืนสตริงย่อยที่ยาวที่สุดเท่าที่จะเป็นไปได้ซึ่งมีอักขระที่ไม่ซ้ำกันจำนวน k ตัว หากมีสตริงย่อยที่มีความยาวมากที่สุดมากกว่าหนึ่งสตริง ให้ส่งคืนสตริงย่อยใดสตริงหนึ่ง

ดังนั้น หากอินพุตเป็น s ="ppqprqtqtqt", k =3 เอาต์พุตจะเป็น rqtqtqt เนื่องจากมีความยาว 7

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

  • ไม่ :=26

  • กำหนดฟังก์ชัน is_ok() นี่จะนับ k

  • ค่า :=0

  • สำหรับผมอยู่ในช่วง 0 ถึง N ทำ

    • ถ้านับ[i]> 0 แล้ว

      • วาล :=วาล + 1

  • คืนค่าเป็นจริงเมื่อ (k>=val)

  • จากวิธีหลัก ให้ทำดังนี้ −

  • ไม่ซ้ำกัน :=0, ขนาด :=ขนาดของ s

  • count :=อาร์เรย์ขนาด N เติม 0

  • สำหรับผมอยู่ในช่วง 0 ถึงขนาด ทำ

    • ถ้าจำนวน s[i] เท่ากับ 0 แล้ว

      • ไม่ซ้ำกัน :=ไม่ซ้ำกัน + 1

    • เพิ่มจำนวน s[i] ขึ้น 1

  • ถ้าเฉพาะ

    • ไม่มีตัวละครและทางออกดังกล่าว

  • เริ่มต้น :=0, สิ้นสุด :=0

  • window_length :=1, window_start :=0

  • count :=อาร์เรย์ขนาด N เติม 0

  • เพิ่มจำนวน s[0] ขึ้น 1

  • สำหรับผมอยู่ในช่วง 1 ถึงขนาด ทำ

    • เพิ่มจำนวน s[i] ขึ้น 1

    • end :=end + 1

    • ในขณะที่ is_ok(นับ k) เป็นเท็จ ทำ

      • ลดจำนวน s[i] ลง 1

      • start :=start + 1

    • ถ้า end-start+1> window_length แล้ว

      • window_length :=end-start+1

      • window_start :=เริ่ม

  • ส่งคืนสตริงย่อยของ s[จากดัชนี window_start ถึง window_start + window_length]

ตัวอย่าง

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

N = 26
def is_ok(count, k):
   val = 0
   for i in range(N):
      if count[i] > 0:
         val += 1
   return (k >= val)
def k_unique_chars(s, k):
   unique = 0
   size = len(s)
   count = [0] * N
   for i in range(size):
      if count[ord(s[i])-ord('a')] == 0:
         unique += 1
      count[ord(s[i])-ord('a')] += 1
   if unique < k:
      return "Not sufficient characters"
   start = 0
   end = 0
   window_length = 1
   window_start = 0
   count = [0] * len(count)
   count[ord(s[0])-ord('a')] += 1
   for i in range(1,size):
      count[ord(s[i])-ord('a')] += 1
      end+=1
      while not is_ok(count, k):
         count[ord(s[start])-ord('a')] -= 1
         start += 1
      if end-start+1 > window_length:
         window_length = end-start+1
         window_start = start
   return s[window_start:window_start + window_length]

s = "ppqprqtqtqt"
k = 3
print(k_unique_chars(s, k))

อินพุต

"ppqprqtqtqt", 3

ผลลัพธ์

rqtqtqt