[LeetCode] 936. Stamping The Sequence 戳印序列
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 <= stamp.length <= target.length <= 1000stampandtargetonly 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
[LeetCode All in One 题目讲解汇总(持续更新中...)](https://www.cnblogs.com/grandyang/p/4606334.html)
[LeetCode] 936. Stamping The Sequence 戳印序列的更多相关文章
- 936. Stamping The Sequence
You want to form a target string of lowercase letters. At the beginning, your sequence is target.len ...
- python3 第十七章 - sequence(序列)
之前我们在讲for循环语句时就提到过序列,那么什么是序列(sequence)? 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 —— 它的索引(位置),第一个索引是0,第二个索引 ...
- EF中创建、使用Oracle数据库的Sequence(序列)功能
** 背景 ** 项目中订单号原来的生成规则由日期加随机数组成,后期需求决定将订单号生成规则更改为生成日期加当天当前订单数. 每天的订单数都是从0开始的,每生成一个订单,订单数就应该加1.订单数应该是 ...
- [Swift]LeetCode936. 戳印序列 | Stamping The Sequence
You want to form a target string of lowercase letters. At the beginning, your sequence is target.len ...
- [LeetCode] Sequence Reconstruction 序列重建
Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...
- [LeetCode] 128. Longest Consecutive Sequence 求最长连续序列
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
- 【LeetCode每天一题】Permutation Sequence(排列序列)
The set [1,2,3,...,n] contains a total of n! unique permutations.By listing and labeling all of the ...
- [leetcode]128. Longest Consecutive Sequence最长连续序列
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. Y ...
- LeetCode 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.Fo ...
随机推荐
- Django报Warning错误 RuntimeWarning: DateTimeField Goods.create_at received a naive datetime (2019-07-31 23:05:58) while time zone support is active
报错和UTC(世界标准时间)有关,在settings.py 文件中设置 USE_TZ = False 警告错误不再报
- js监听离开或刷新页面时的弹窗提示
一.看图 二.使用场景. 填写表单时内容,当离开页面或者刷新的时候回丢失页面的内容,因此人性化的设计该有一个提示.所以这样的功能也就应用而生了. 三.思路. 1,页面内容改变.2,离开或刷新浏览器触发 ...
- 【JavaScript】DOM之Document对象
JS(JavaScript) 一.Document对象 1.Document对象是什么 Document对象 是DOM的基本规范也是重要的对象之一,以访问,更新页面内容的属性和方法通过conslie. ...
- objectarx 填充的分割
主要思路:找到填充边界集合:vecBo,然后把面积最大的边界找出来:bo1,用分割曲线和bo1通过boundary命令构成两个新的最大封闭边界,左边的记为 boLeft(红色部分),右边的记为boRi ...
- PYTHON 第二天学习记录
- JavaScript(js)函数声明与函数表达式的区别
在JavaScript中,函数是经常用到的,在实际开发的时候,我想很多人都没有太在意函数的声明与函数表达式的区别,但是呢,这种细节的东西对于学好js是非常重要的. 函数声明与函数表达式用代码写出来是这 ...
- docker的安装使用
目录 Docker 入门到精通 CentOS安装Docker 设置管理Docker的仓库 安装Docker Engine-Community Docker基础命令 开启关闭 镜像操作 容器操作 Doc ...
- 打造你的第一个 Electron 应用
Electron 可以让你使用纯 JavaScript 调用丰富的原生(操作系统) APIs 来创造桌面应用. 你可以把它看作一个 Node. js 的变体,它专注于桌面应用而不是 Web 服务器端. ...
- Matplotlib数据可视化(7):图片展示与保存
In [1]: import os import matplotlib.image as mpimg from PIL import Image import matplotlib.pyplot as ...
- C语言程序设计(十) 字符串
第十章 字符串 字符串常量是由一对双引号括起来的一个字符串序列 字符串实际就是由若干个有效数字构成且以字符'\0'作为结束的一个字符序列 C语言没有提供字符串数据类型,因此字符串的存取要用字符型数组来 ...