You want to form a `target` string of lowercase letters.

At the beginning, your sequence is target.length '?' marks.  You also have a stamp of lowercase letters.

On each turn, you may place the stamp over the sequence, and replace every letter in the sequence with the corresponding letter from the stamp.  You can make up to 10 * target.length turns.

For example, if the initial sequence is "?????", and your stamp is "abc",  then you may make "abc??", "?abc?", "??abc" in the first turn.  (Note that the stamp must be fully contained in the boundaries of the sequence in order to stamp.)

If the sequence is possible to stamp, then return an array of the index of the left-most letter being stamped at each turn.  If the sequence is not possible to stamp, return an empty array.

For example, if the sequence is "ababc", and the stamp is "abc", then we could return the answer [0, 2], corresponding to the moves "?????" -> "abc??" -> "ababc".

Also, if the sequence is possible to stamp, it is guaranteed it is possible to stamp within 10 * target.length moves.  Any answers specifying more than this number of moves will not be accepted.

Example 1:

Input: stamp = "abc", target = "ababc"
Output: [0,2]
([1,0,2] would also be accepted as an answer, as well as some other answers.)

Example 2:

Input: stamp = "abca", target = "aabcaca"
Output: [3,0,1]

Note:

  1. 1 <= stamp.length <= target.length <= 1000
  2. stamp and target only contain lowercase letters.

这道题给了一个目标字符串 target,还有一个印戳字符串 stamp,现在有一个长度跟 target 一样的一排问号,每次可以在某个位置盖上印戳,新的印戳将会覆盖之前的字符,不论是问号还是其他字符,现在让找出所有盖印戳的位置,使得刚好可以盖出给定的字符串 target。这道题乍一看感觉还挺难下手的,毕竟一排问号,我们怎么知道该从哪里开始盖,但是如果换一个方向,假如给的是 target 字符串,每次盖印章,将对应的位置变成星号,只要将 target 中所有的字符盖成星号,最终再把盖印章的顺序翻转一下,就是题目中所求了。这里参考的是 [votrubac 大神的帖子](https://leetcode.com/problems/stamping-the-sequence/discuss/189576/C%2B%2B-simple-greedy),比如 target="aabccbc",stamp="abc",那么首先肯定是在 target 中找整个的 abc,可以找到,从位置1出开始盖,target 变为 a\*\*\*cbc,同时标记此时已经盖了3个字母,加入到 total 变量中。然后继续找 abc,没有的话,就需要改变印戳了,开始往里面加星号,首先加一个星号,加的位置有三个,分别是 ab\*, a\*c, \*bc,发现这三种都无法匹配,于是开始加两个星号,就有 a\*\*,\*\*c,其中 a\*\* 可以成功匹配,起始位置为0,total 加1,于是 target 变为 ****cbc,然后发现此时 \*\*c 也可以成功匹配,起始位置为2,total 加1,target 变为 *****bc。现在并不需要给 stamp 中加三个星号,这样没有意义,要做的是再从开头找一遍,此时发现 \*bc 可以匹配,起始位置为4,total 加2,到现在位置 target 完全变为星号,当无法进行盖印戳的时候,就退出循环,需要一个 isStamped 的变量来标记一下是否进行了戳印。循环退出后要将 res 数组翻转一下,同时还要看 total 是否等于 target 的长度,只有相等了,才说明每个字母都被戳印了,否则返回空集,参见代码如下:

class Solution {
public:
vector<int> movesToStamp(string stamp, string target) {
vector<int> res;
int n = stamp.size(), total = 0;
while (true) {
bool isStamped = false;
for (int size = n; size > 0; --size) {
for (int i = 0; i <= n - size; ++i) {
string t = string(i, '*') + stamp.substr(i, size) + string(n - size - i, '*');
auto pos = target.find(t);
while (pos != string::npos) {
res.push_back(pos);
isStamped = true;
total += size;
fill(begin(target) + pos, begin(target) + pos + n, '*');
pos = target.find(t);
}
}
}
if (!isStamped) break;
}
reverse(res.begin(), res.end());
return total == target.size() ? res : vector<int>();
}
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/936

参考资料:

https://leetcode.com/problems/stamping-the-sequence/

https://leetcode.com/problems/stamping-the-sequence/discuss/189576/C%2B%2B-simple-greedy

https://leetcode.com/problems/stamping-the-sequence/discuss/189258/C%2B%2B-Reverse-Operation-30-ms-better-than-DFS

https://leetcode.com/problems/stamping-the-sequence/discuss/450930/C%2B%2B-Reverse-the-stamping-process-%2B-Wildcard-matching

[LeetCode All in One 题目讲解汇总(持续更新中...)](https://www.cnblogs.com/grandyang/p/4606334.html)

[LeetCode] 936. Stamping The Sequence 戳印序列的更多相关文章

  1. 936. Stamping The Sequence

    You want to form a target string of lowercase letters. At the beginning, your sequence is target.len ...

  2. python3 第十七章 - sequence(序列)

    之前我们在讲for循环语句时就提到过序列,那么什么是序列(sequence)? 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 —— 它的索引(位置),第一个索引是0,第二个索引 ...

  3. EF中创建、使用Oracle数据库的Sequence(序列)功能

    ** 背景 ** 项目中订单号原来的生成规则由日期加随机数组成,后期需求决定将订单号生成规则更改为生成日期加当天当前订单数. 每天的订单数都是从0开始的,每生成一个订单,订单数就应该加1.订单数应该是 ...

  4. [Swift]LeetCode936. 戳印序列 | Stamping The Sequence

    You want to form a target string of lowercase letters. At the beginning, your sequence is target.len ...

  5. [LeetCode] Sequence Reconstruction 序列重建

    Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...

  6. [LeetCode] 128. Longest Consecutive Sequence 求最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  7. 【LeetCode每天一题】Permutation Sequence(排列序列)

    The set [1,2,3,...,n] contains a total of n! unique permutations.By listing and labeling all of the ...

  8. [leetcode]128. Longest Consecutive Sequence最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. Y ...

  9. LeetCode 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence.Fo ...

随机推荐

  1. 用jekyll和github把网站建起来!

    先把这些天学习的用jekyll在github上搭建网站的步骤记录下来,留作参考. #安装jekyll 确定系统安装 Git, Ruby, RubyGems, Nodejs, Python2.7. 如何 ...

  2. AAAI 2020论文分享:通过识别和翻译交互打造更优的语音翻译模型

    2月初,AAAI 2020在美国纽约拉开了帷幕.本届大会百度共有28篇论文被收录.本文将对其中的机器翻译领域入选论文<Synchronous Speech Recognition and Spe ...

  3. iOS Swift 开发语言之初接触,纯代码创建UIView,UITableView,UICollectionView

    1. 初始化Label设置AttributeString override func viewDidLoad() { let label = UILabel(frame:CGRect(x:,y:,wi ...

  4. volatile和synchronized到底啥区别?多图文讲解告诉你

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  5. Dubbo 入门-细说分布式与集群

    什么是Dubbo Dubbo是一款高性能.轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现. 什么是RPC RPC全称(Rem ...

  6. .Net vs .Net Core,我改如何选择?看这一篇文章就够了

    前言 .Net目前支持构建服务器端应用程序的两种实现主要有两种,.NET Framework和.NET Core.两者共享许多相同的组件,并且您可以在两者之间共享代码.但是,两者之间存在根本差异,在我 ...

  7. 第一篇:解析Linux是什么?能干什么?它的应用领域!

    不得不说的前言(不看完睡觉会尿床):饿货们~!你说你们上学都学了点啥?这不懂那也不懂,快毕业了啥也不会.专业课程不学好毕业了也找不到好工作.爸妈给你养大,投资了多少钱.你毕业后随便找了个什么鸡毛工作开 ...

  8. Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习)

    Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习)                                                           ...

  9. 添加bash命令

    cd ~/.bash vim mya 键入 #!/bin/bash hostname -i :x 保存退出 source ~/.bash_profile 生效

  10. leetcode面试题42. 连续子数组的最大和

      总结一道leetcode上的高频题,反反复复遇到了好多次,特别适合作为一道动态规划入门题,本文将详细的从读题开始,介绍解题思路. 题目描述示例动态规划分析代码结果 题目   面试题42. 连续子数 ...