Giả sử chúng ta được cung cấp hai chuỗi, cả hai đều được làm bằng bảng chữ cái viết thường. Chúng ta phải tìm ra số phần tư (p, q, r, s) thỏa mãn các điều kiện cho trước -
-
0 <=p <=q <=độ dài của chuỗi đầu tiên.
-
0 <=r <=s <=độ dài của chuỗi thứ hai.
-
Chuỗi con bắt đầu từ chỉ mục p của chuỗi đầu tiên và kết thúc ở chỉ mục q của chuỗi đầu tiên, phải bằng chuỗi con bắt đầu từ chỉ mục q của chuỗi thứ hai và kết thúc ở chỉ mục r của chuỗi thứ hai.
-
q - r phải là giá trị nhỏ nhất có thể có trong tất cả các phần tư thỏa mãn điều kiện trên.
Chúng ta phải tìm ra số phần tư như vậy.
Vì vậy, nếu đầu vào giống như firstString ='hgfn', secondString ='gfrt', thì đầu ra sẽ là 2.
Có hai phần tư (1, 1, 0, 0) và (2, 2, 1, 1) thỏa mãn các điều kiện và có giá trị nhỏ nhất đối với q - r.
Để 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àm ord (). Điều này sẽ mất ch
- trả về giá trị unicode của ch
- Từ phương thức chính, hãy làm như sau -
- left:=một danh sách mới có kích thước 26 chứa giá trị vô cực
- right:=một danh sách mới có kích thước 26 chứa giá trị -1
- res:=0
- mi:=infinity
- đối với mỗi chỉ mục i và ký tự ch trong Chuỗi đầu tiên, thực hiện
- left [ord (ch) - ord ('a')]:=tối thiểu của (left [ord (ch) - ord ('a')], i)
- đối với mỗi chỉ mục i và ký tự ch trong chuỗi thứ hai, thực hiện
- right [ord (ch) - ord ('a')]:=tối đa bên phải [ord (ch) - ord ('a')], i
- đối với tôi trong phạm vi từ 0 đến 25, hãy thực hiện
- nếu left [i] không giống -1, thì
- mi:=tối thiểu trong tổng số (mi, left [i] - right [i])
- nếu left [i] không giống -1, thì
- đối với tôi trong phạm vi từ 0 đến 25, hãy thực hiện
- nếu trái [i] không giống với vô cùng và phải [i] không giống -1, thì
- nếu left [i] - right [i] giống với mi, thì
- res:=res + 1
- nếu left [i] - right [i] giống với mi, thì
- nếu trái [i] không giống với vô cùng và phải [i] không giống -1, thì
- trả lại res
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
def solve(firstString, secondString): left = [float('inf')] * 26 right = [-1] * 26 res = 0 mi = float('inf') for i, ch in enumerate(firstString): left[ord(ch) - ord('a')] = min(left[ord(ch) - ord('a')], i) for i, ch in enumerate(secondString): right[ord(ch) - ord('a')] = max(right[ord(ch) - ord('a')], i) for i in range(26): if left[i] != -1: mi = min(mi, left[i] - right[i]) for i in range(26): if left[i] != float('inf') and right[i] != -1: if left[i] - right[i] == mi: res += 1 return res print(solve('hgfn', 'gfrt'))
Đầu vào
'hgfn', 'gfrt'
Đầu ra
2