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

โปรแกรมค้นหาสตริงที่เล็กที่สุดในพจนานุกรมหลังจากใช้การดำเนินการใน Python


สมมติว่าเรามีสตริง s ที่มีตัวเลขเท่านั้น และมีค่า a และ b สองค่า เราสามารถใช้หนึ่งในสองการดำเนินการต่อไปนี้กี่ครั้งก็ได้และเรียงลำดับตาม s −

  • เพิ่ม 'a' ให้กับรายการตำแหน่งคี่ทั้งหมดของ s (0-indexed) หากหลักเป็น 9 การเพิ่มบางอย่างด้วยจะวนกลับเป็น 0

  • หมุน 's' ไปทางขวาโดยตำแหน่ง b

ดังนั้น เราต้องหาสตริงที่เล็กที่สุดเกี่ยวกับศัพท์เฉพาะที่เราหาได้จากการดำเนินการข้างต้นจำนวนครั้งใน s

ดังนั้น หากอินพุตเป็น s ="5323" a =9 b =2 ผลลัพธ์จะเป็น 2050 เพราะหากเราติดตาม

  • หมุน:"5323"
  • เพิ่ม:"5222"
  • เพิ่ม:"5121"
  • หมุน:"2151"
  • เพิ่ม:"2050"

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

  • เห็นแล้ว :=ชุดใหม่
  • deq :=คิวใหม่ที่มีหนึ่งองค์ประกอบ 's'
  • ในขณะที่ deq ไม่ว่างเปล่า ทำ
    • curr :=องค์ประกอบที่ถูกลบครั้งแรกของ deq
    • ใส่เคอร์เซอร์ในชุดที่เห็น
    • โฆษณา :=ดำเนินการเพิ่มที่กำหนดในสกุลเงิน
    • ถ้าไม่เห็นโฆษณาก็
      • แทรกโฆษณาที่ส่วนท้ายของ deq
      • แทรกโฆษณาในชุดที่เห็น
    • ro :=ดำเนินการหมุนเวียนกับสกุลเงิน
    • ถ้าไม่เห็น ro ก็
      • ใส่ ro ที่ส่วนท้ายของ deq
      • ใส่ ro ในชุดที่เห็น
  • คืนขั้นต่ำที่เห็น

ตัวอย่าง

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

from collections import deque
def add_(s,a):
   res = ''
   for idx, i in enumerate(s):
      if idx % 2 == 1:
         num = (int(i) + a) % 10
         res += str(num)
      else:
         res += i

   return res

def rotate_(s, b):
   idx = len(s)-b
   res = s[idx:] + s[0:idx]
   return res

def solve(s, a, b):
   seen = set()
   deq = deque([s])

   while deq:
      curr = deq.popleft()
      seen.add(curr)

      ad = add_(curr, a)
      if ad not in seen:
         deq.append(ad)
         seen.add(ad)

      ro = rotate_(curr, b)
      if ro not in seen:
         deq.append(ro)
         seen.add(ro)

   return min(seen)

s = "5323"
a = 9
b = 2
print(solve(s, a, b))

อินพุต

"5323", 9, 2

ผลลัพธ์

2050