Mô tả bài toán
Muốn tạo chuỗi mục tiêu t từ chuỗi ban đầu toàn '?' độ dài n. Có con dấu s. Mỗi lượt đặt con dấu lên chuỗi, thay thế các ký tự tương ứng. Tối đa 10*n lượt. Trả về mảng chỉ số trái nhất của con dấu mỗi lượt, hoặc mảng rỗng nếu không thể.
Ví dụ
s = "abcd", t = "abcdbcd" -> [3, 0] (đặt tại 3: "???abcd", rồi tại 0: "abcdbcd").
Giải thuật
- Nếu
len(s) == 1: kiểm tra tất cả ký tựtcó bằngs[0]. - Lặp cho đến khi
ttoàn'?':- Thử mọi đoạn con của
s(từiđếnj-1) bao quanh bởi'?'. - Tìm vị trí khớp trong
t, thay thế bằng'?', lưu chỉ số.
- Thử mọi đoạn con của
- Nếu không tiến triển -> trả về
[]. - Đảo ngược kết quả trước khi trả về.
Triển khai Python
def solve(s, t):
if len(s) == 1:
return [i for i in range(len(t))] if all(ch == s[0] for ch in t) else []
ans = []
while t != "?" * len(t):
tmp = t
for i in range(len(s)):
for j in reversed(range(i + 1, len(s) + 1)):
search = "?" * i + s[i:j] + "?" * (len(s) - j)
while t.find(search) != -1:
ans.append(t.find(search))
t = t.replace(search, "?" * len(s), 1)
if t == "?" * len(t):
break
if t == "?" * len(t):
break
if t == "?" * len(t):
break
if tmp == t:
return []
return ans[::-1]
s = "abcd"
t = "abcdbcd"
print(solve(s, t))
Đầu vào
"abcd", "abcdbcd"
Đầu ra
[3, 0]