用 Python 编写的查找方阵数量的程序

pythonserver side programmingprogramming更新于 2025/12/9 14:36:17

假设我们想要制作一个小写字母的目标字符串。首先,我们有 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]

相关文章


有用资源