你想要用小写字母组成一个目标字符串 target。
开始的时候,序列由 target.length 个 ‘?’ 记号组成。而你有一个小写字母印章 stamp。
在每个回合,你可以将印章放在序列上,并将序列中的每个字母替换为印章上的相应字母。你最多可以进行 10 * target.length 个回合。
举个例子,如果初始序列为 “???”,而你的印章 stamp 是 “abc”,那么在第一回合,你可以得到 “abc??”、"?abc?"、"??abc"。(请注意,印章必须完全包含在序列的边界内才能盖下去。)
如果可以印出序列,那么返回一个数组,该数组由每个回合中被印下的最左边字母的索引组成。如果不能印出序列,就返回一个空数组。
例如,如果序列是 “ababc”,印章是 “abc”,那么我们就可以返回与操作 “???” -> “abc??” -> “ababc” 相对应的答案 [0, 2];
另外,如果可以印出序列,那么需要保证可以在 10 * target.length 个回合内完成。任何超过此数字的答案将不被接受。
示例 1:
输入:stamp = “abc”, target = “ababc”
输出:[0,2]
([1,0,2] 以及其他一些可能的结果也将作为答案被接受)
示例 2:
输入:stamp = “abca”, target = “aabcaca”
输出:[3,0,1]
提示:
1 <= stamp.length <= target.length <= 1000
stamp 和 target 只包含小写字母。
# Author:ZJF
class Solution:
def __init__(self):
self.count = 0
self.number_list = []
def is_coincide(self, list1, list2): #此函数用于判断印章是否能和目标字符串切出来的部分重合
if "".join(list1).isdigit():
return False
else:
for (m, n) in zip(list1, list2): # 切出来的和印章匹配
if m != n and m != "0":
return False
else:
return True
def movesToStamp(self, stamp, target):
m = len(stamp)
n = len(target)
stamp_list = list(stamp) # 将字符串转化成字典方便操作
target_list = list(target)
while True:
if "".join(target_list).isdigit():
self.number_list.reverse()
print(self.count)
return self.number_list
if self.count>10:
print(self.count)
return[]
else:
self.count += 1
for i in range(n-m+1): # 补全印章
the_list = target_list[i:i + m]
if self.is_coincide(the_list, stamp_list):
self.number_list.append(i)
target_list[i:i+m] = ["0"]*m