C++ 中的序列盖印


假设我们想要创建一个由小写字母组成的目标字符串。

首先,我们有一个序列,包含 n 个“?”标记(n 是目标字符串的长度)。我们还有一个由小写字母组成的印章。

在每一轮中,我们可以在序列上放置印章,并用印章中对应的字母替换序列中的每个字母。您可以最多进行 10 * n 轮。例如,如果初始序列为“?????”,印章为“abc”,那么在第一轮中我们可以创建诸如“abc??”、“?abc?”、“??abc”之类的字符串。

如果序列可以被盖印,则返回一个数组,其中包含每一轮最左侧被盖印字母的索引。如果不可能,则返回一个空数组。因此,当序列为“ababc”,印章为“abc”时,答案可以是 [0, 2],因为我们可以这样形成: “?????” -> “abc??” -> “ababc”。

因此,如果输入类似于 stamp = "abcd",target = "abcdbcd",则输出将为 [3,0]

为了解决这个问题,我们将遵循以下步骤:

  • 定义一个数组 ret

  • ok := true

  • n := 印章的大小

  • tsz := 0

  • 当 ok 不为零时,执行以下操作:

    • ok := false

    • x := 0

    • 对于初始化 sz := 印章的大小,当 sz > 0 时,更新(sz 减 1),执行以下操作:

      • 对于初始化 i := 0,当 i <= 印章的大小,更新(i 加 1),执行以下操作:

        • newStamp := 一个长度为 i 的“*”字符串 + 从索引 i 到 sz-1 的印章子字符串 + 一个大小与印章大小相同的“*”字符串

        • pos := target 中 newStamp 的索引

        • 当 pos 存在于 target 中时,执行以下操作:

          • ok := true

          • x := x + sz

          • 在 ret 的末尾插入 pos。

          • 用“*”填充 target 从位置 pos 到 pos + 印章大小。

          • pos := target 中 newStamp 的索引

    • tsz := tsz + x

  • 反转数组 ret

  • 返回(如果 tsz 与 target 的大小相同,则返回 ret,否则返回一个空数组)

让我们看看下面的实现,以便更好地理解:

示例

 实时演示

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   } cout << "]"<<endl;
}
class Solution {
   public:
   vector<int> movesToStamp(string stamp, string target) {
      vector<int> ret;
      bool ok = true;
      int n = stamp.size();
      int tsz = 0;
      while (ok) {
         ok = false;
         int x = 0;
         for (int sz = stamp.size(); sz > 0; sz--) {
            for (int i = 0; i <= stamp.size() - sz; i++) {
               string newStamp = string(i, '*') +
               stamp.substr(i, sz) + string(stamp.size() - sz - i, '*');
               int pos = target.find(newStamp);
               while (pos != string::npos) {
                  ok = true;
                  x += sz;
                  ret.push_back(pos);
                  fill(target.begin() + pos, target.begin() +
                  pos + stamp.size(), '*');
                  pos = target.find(newStamp);
               }
            }
         }
         tsz += x;
      }
      reverse(ret.begin(), ret.end());
      return tsz == target.size() ? ret : vector<int>();
   }
};
main(){
   Solution ob;
   print_vector(ob.movesToStamp("abcd", "abcdbcd"));
}

输入

"abcd", "abcdbcd"

输出

[3, 0, ]

更新于: 2020-06-08

211 次查看

开启你的 职业生涯

通过完成课程获得认证

开始
广告