"""
You are given two strings stamp and target. Initially, there is a string s of length target.length with all s[i] == '?'.

In one turn, you can place stamp over s and replace every letter in the s with the corresponding letter from stamp.

For example, if stamp = "abc" and target = "abcba", then s is "?????" initially. In one turn you can:
place stamp at index 0 of s to obtain "abc??",
place stamp at index 1 of s to obtain "?abc?", or
place stamp at index 2 of s to obtain "??abc".
Note that stamp must be fully contained in the boundaries of s in order to stamp (i.e., you cannot place stamp at index 3 of s).
We want to convert s to target using at most 10 * target.length turns.

Return an array of the index of the left-most letter being stamped at each turn. If we cannot obtain target from s within 10 * target.length turns, return an empty array.

Example 1:
Input: stamp = "abc", target = "ababc"
Output: [0,2]
Explanation: Initially s = "?????".
- Place stamp at index 0 to get "abc??".
- Place stamp at index 2 to get "ababc".
[1,0,2] would also be accepted as an answer, as well as some other answers.

Example 2:
Input: stamp = "abca", target = "aabcaca"
Output: [3,0,1]
Explanation: Initially s = "???????".
- Place stamp at index 3 to get "???abca".
- Place stamp at index 0 to get "abcabca".
- Place stamp at index 1 to get "aabcaca".

Constraints:
1 <= stamp.length <= target.length <= 1000
stamp and target consist of lowercase English letters.
"""
from typing import List


class StampingTheSequence:
    def movesToStamp(self, stamp: str, target: str) -> List[int]:
        stamp_len, target_len, stamp, target, res = len(stamp), len(target), list(stamp), list(target), []

        def canStampAt(i):
            changed = False
            for j in range(stamp_len):
                if target[i + j] == '?':
                    continue
                if target[i + j] != stamp[j]:
                    return False
                changed = True
            if changed:
                target[i: i + stamp_len] = ['?'] * stamp_len
                res.append(i)
            return changed

        changed = True
        while changed:
            changed = False
            for i in range(target_len - stamp_len + 1):
                changed |= canStampAt(i)
        return res[::-1] if target == ['?'] * target_len else []