Leetcode936. 戳印序列

你想要用小写字母组成一个目标字符串 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

你可能感兴趣的:(编程练习)