Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình tìm giá trị nhỏ nhất của K cho K-Chuỗi tương tự trong Python

Giả sử chúng ta có hai chuỗi s và t. Hai chuỗi này giống nhau K nếu chúng ta có thể hoán đổi vị trí của hai chữ cái trong s đúng K lần để chuỗi kết quả là t. Vì vậy, chúng ta có hai phép đảo chữ s và t, chúng ta phải tìm K nhỏ nhất mà s và t tương tự K.

Vì vậy, nếu đầu vào là s =​​"abc" t ="bac", thì đầu ra sẽ là 1.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Định nghĩa một hàng xóm của hàm (). Thao tác này sẽ lấy new_data

  • đối với mỗi chỉ mục i và giá trị c trong new_data, hãy thực hiện

    • nếu c không giống với t [i], thì

      • đi ra từ vòng lặp

  • đối với j trong phạm vi i + 1 đến kích thước của new_data - 1, thực hiện

    • nếu u [j] giống với t [i] thì

      • trao đổi new_data [i] new_data [j]

      • tạo một chuỗi bằng cách kết hợp tất cả các phần tử từ new_data và quay lại, từ lần gọi tiếp theo, bắt đầu lại từ khu vực này

      • trao đổi new_data [i] new_data [j]

  • Từ phương thức chính, thực hiện như sau:

  • q:=tạo một hàng đợi và chèn cặp (s, 0)

  • đã thấy:=một tập hợp mới từ s

  • trong khi q không trống, thực hiện

    • (u, swap_cnt):=mục đầu tiên của q và xóa nó khỏi q

    • nếu bạn giống với t, thì

      • trả về swap_cnt

    • đối với mỗi v trong các hàng xóm (u dưới dạng danh sách), hãy thực hiện

      • nếu v không được nhìn thấy, thì

        • đánh dấu v như đã thấy

        • insert (v, swap_cnt + 1) vào cuối q

  • trả về 0

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau đây để hiểu rõ hơn

from collections import deque
def solve(s, t):
   def swap(data, i, j):
      data[i], data[j] = data[j], data[i]

   def neighbors(new_data):
      for i, c in enumerate(new_data):
         if c != t[i]: break

      for j in range(i+1, len(new_data)):
         if u[j] == t[i]:
            swap(new_data, i, j)
            yield "".join(new_data)
            swap(new_data, i, j)

   q = deque([(s, 0)])
   seen = set(s)
   while q:
      u, swap_cnt = q.popleft()
      if u == t:
         return swap_cnt
      for v in neighbors(list(u)):
         if v not in seen:
            seen.add(v)
            q.append((v, swap_cnt+1))
   return 0

s = "abc"
t = "bac"
print(solve(s, t))

Đầu vào

"abc, bac"

Đầu ra

1