Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Chương trình tìm số mảng squareful trong Python


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

  1. Nếu len(s) == 1: kiểm tra tất cả ký tự t có bằng s[0].
  2. Lặp cho đến khi t toàn '?':
    • Thử mọi đoạn con của s (từ i đến j-1) bao quanh bởi '?'.
    • Tìm vị trí khớp trong t, thay thế bằng '?', lưu chỉ số.
  3. Nếu không tiến triển -> trả về [].
  4. Đả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]