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

โปรแกรมหาความยาวของสตริงย่อยที่สองเท่าของจำนวนศูนย์ในสตริงย่อยน้อยกว่าหรือเท่ากับสามเท่าของจำนวนในสตริงย่อยใน Python


สมมติว่าเราได้รับสตริงและจำนวนเต็ม k สตริงซ้ำ k ครั้งและทำเป็นสตริงอื่น งานของเราคือการหาความยาวของสตริงย่อยในสตริงใหม่โดยที่ 2 * (จำนวนศูนย์ในสตริงย่อย) <=3 * (จำนวนหนึ่งในสตริงย่อย)

ดังนั้น หากอินพุตเป็น k =2, input_str ='0101011' เอาต์พุตจะเป็น 14

สตริงมีความยาว 7 ดังนั้นสตริงใหม่ที่สร้างจากสตริงแรกคือ 01010110101011 ในที่นี้จำนวน 0s คือ 6 และจำนวน 1s คือ 8 ดังนั้น 2 * 6 <=3 * 8 สตริงย่อยที่ใหญ่ที่สุดจึงเป็นสตริงทั้งหมดที่มีความยาว 14

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

  • str_len :=ขนาดของอินพุต_str
  • list_a :=รายการขนาดใหม่ (str_len + 1) เริ่มต้นด้วย 0s
  • list_b :=รายการขนาดใหม่ (str_len + 1) เริ่มต้นด้วย 0s
  • list_b[0] :=คู่ใหม่ที่มี (0, 0)
  • สำหรับฉันอยู่ในช่วง 0 ถึง str_len ทำ
    • list_a[i + 1] :=list_a[i] - 3 *(1 if input_str[i] เหมือนกับ '1', อย่างอื่น 0) + 2 *(1 if input_str[i] เหมือนกับ '0 ', อย่างอื่น 0)
    • list_b[i + 1] :=คู่ใหม่ประกอบด้วย (list_a[i + 1], i + 1)
  • เรียงลำดับรายการ list_b
  • temp_list :=รายการขนาดใหม่ (str_len + 1) เริ่มต้นด้วย 0s
  • temp_list[0] :=list_b[0, 1]
  • สำหรับฉันอยู่ในช่วง 0 ถึง str_len ทำ
    • temp_list[i + 1] =สูงสุดของ (temp_list[i], list_b[i + 1, 1])
  • res :=0
  • สำหรับฉันอยู่ในช่วง 0 ถึง str_len ทำ
    • tmp :=list_b[0, 0] - list_a[i]
    • ถ้า list_a[str_len] <=0 แล้ว
      • a :=k - 1
      • ถ้า tmp + list_a[str_len] * a> 0 แล้ว
        • ติดตามตอนต่อไป
    • มิฉะนั้นเมื่อ tmp> 0 แล้ว
      • ติดตามตอนต่อไป
    • มิฉะนั้น
      • a :=ขั้นต่ำ (k - 1, มูลค่าขั้นต่ำของ (-tmp / list_a[str_len])))
    • v :=a * list_a[str_len] - list_a[i]
    • b :=(ตำแหน่งใน list_b ที่สามารถแทรกคู่ (-v + 1, 0) เพื่อรักษาลำดับการเรียงลำดับ) - 1
    • res :=สูงสุดของ (res, temp_list[b] - i + a * str_len)
  • ผลตอบแทน

ตัวอย่าง

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

from bisect import bisect_left
def solve(k, input_str):
   str_len = len(input_str)
   list_a = [0] * (str_len + 1)
   list_b = [0] * (str_len + 1)
   list_b[0] = (0, 0)
   for i in range(str_len):
      list_a[i + 1] = list_a[i] - 3 * (input_str[i] == '1') + 2 * (input_str[i] == '0')
      list_b[i + 1] = (list_a[i + 1], i + 1)

   list_b.sort()
   temp_list = [0] * (str_len + 1)
   temp_list[0] = list_b[0][1]
   for i in range(str_len):
      temp_list[i + 1] = max(temp_list[i], list_b[i + 1][1])
   res = 0
   for i in range(str_len):
      tmp = list_b[0][0] - list_a[i]
      if list_a[str_len] <= 0:
         a = k - 1
         if tmp + list_a[str_len] * a > 0:
            continue
      elif tmp > 0:
         continue
      else:
         a = min(k - 1, -tmp // list_a[str_len])

      v = a * list_a[str_len] - list_a[i]
      b = bisect_left(list_b, (-v + 1, 0)) - 1
      res = max(res, temp_list[b] - i + a * str_len)
   return res

print(solve(2, '0101011'))

อินพุต

2, '0101011'

ผลลัพธ์

14