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. Autowired和Resource区别

    @Autowired和@Resource熟悉吧?是不是经常复制粘贴顺手就来,两者都是用来给成员变量自动装载,可是它俩到底有啥区别呢? 1.@Autowired与@Resource都可以用来装配bean ...

  2. [开源福利] Arithmetic Generator

    Arithmetic Generator Built with ❤︎ by Simon Ma ✨ A powerful arithmetic generator

  3. 等效燃油消耗ECMS与庞德里亚金最小值原理PMP中协同状态的关系

    今儿阅读了一篇文献——<车联网环境下并联混合动力客车控制策略优化研究>,是北理的博士所写的,内容比较翔实.主要是里面的关于ECMS和庞德里亚金最小值原理(PMP)的关系推导很让人印象深刻, ...

  4. C++中cin的输入分隔符问题及相关

    1.C/C++中的类型转换函数(区分类中的类型转换构造函数): 头文件:C中stdlib.h C++中cstdlib atof(将字符串转换成浮点型数) atoi(将字符串转换成整型数) atol(将 ...

  5. Day 1 模拟

    1. P1088 火星人 利用STL中的next_permutation();函数求一种排列的下一种排列,循环m次即为答案.(STL大法好~~C++是世界上最好的语言~~逃 #include < ...

  6. CVE-2019-0708 远程桌面漏洞复现

    漏洞影响Windows版本: Windows XP SP3 x86Windows XP Professional x64 Edition SP2Windows XP Embedded SP3 x86W ...

  7. audioContext.decodeAudioData 返回null 错误

    此问题并不是100%出现.没想到国外大神已经有处理此问题的经验 原贴地址: https://stackoverflow.com/questions/10365335/decodeaudiodata-r ...

  8. Spring源码阅读笔记04:默认xml标签解析

    上文我们主要学习了Spring是如何获取xml配置文件并且将其转换成Document,我们知道xml文件是由各种标签组成,Spring需要将其解析成对应的配置信息.之前提到过Spring中的标签包括默 ...

  9. Linq的整型或实体类null引发的报错问题

    经常在程序中遇到两个空值报错问题: 问题1:int类型如果为不可空,假如传进去null,会报错 问题2:EF的获得单个实体的Model如果为空,那么后面如果跟上属性会报错 解决问题1: 一般属性都设为 ...

  10. 深入学习JAVA注解-Annotation(学习过程)

    JAVA注解-Annotation学习 本文目的:项目开发过程中遇到自定义注解,想要弄清楚其原理,但是自己的基础知识不足以支撑自己去探索此问题,所以先记录问题,然后补充基础知识,然后解决其问题.记录此 ...