用 Python 编写的查找方阵数量的程序
假设我们想要制作一个小写字母的目标字符串。首先,我们有 n 个"?"标记的序列(n 是目标字符串的长度)。我们还有一个小写字母的印章。每次转动时,我们都可以将印章放在序列上,并用该印章中的相应字母替换序列中的每个字母。您最多可以制作 10 * n 个回合。
例如,假设初始序列为"?????",而印章为"abc",那么我们可以在第一轮中制作出类似"abc??"、"?abc?"、"??abc"的字符串。如果该序列可以盖印,则返回一个索引数组,其中最左边的字母在每个回合中被盖印。如果不可能,则返回一个空数组。因此,当序列为"ababc",而印章为"abc"时,答案可以是 [0, 2],因为我们可以形成类似"?????" -> "abc??" - > "ababc"。
因此,如果输入为 s = "abcd" t = "abcdbcd",则输出将为 [3,0]
为了解决这个问题,我们将遵循以下步骤 −
如果 s 的大小与 1 相同,则
当 t 中的所有字符都相同且它们是 s[0] 时,返回从 0 到 t 的列表,否则返回一个新的空白列表
ans := 一个新列表
当 t 与 t 的大小不同时 "?" 的数量标记,执行
tmp := t
对于范围从 0 到 s 大小的 i,执行
对于 s 大小中的 j,向下到 i+1:
搜索 := i 个"?" 连接 s 的子字符串[从索引 i 到 j-1] 连接 (s 大小 - j) 个"?"
当搜索在 t 中时,执行
在 ans 的末尾插入搜索在 t 中的位置
t := 用 s 大小的"?"替换搜索仅一次
如果 t 与 t 个"?"的大小相同,则
退出循环
如果 t 与 t 中 "?" 的数量大小相同,则
退出循环
如果 tmp 与 t 相同,则
退出循环
返回 ans 的反转。
示例
让我们看看下面的实现以便更好地理解
def solve(s, t): if len(s) == 1: return [i for i in range(len(t))] if all(t==s[0] for t 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 tmp == t: return [] return ans[::-1] s = "abcd" t = "abcdbcd" print(solve(s, t))
输入
"abcd", "abcdbcd"
输出
[3,0]
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

