3614.用特殊操作处理字符串 II:正算长度反定位(还不错的题解Doge)
【LetMeFly】3614.用特殊操作处理字符串 II:正算长度反定位(还不错的题解Doge)
力扣题目链接:https://leetcode.cn/problems/process-string-with-special-operations-ii/
给你一个字符串 s,由小写英文字母和特殊字符:'*'、'#' 和 '%' 组成。
同时给你一个整数 k。
请根据以下规则从左到右处理 s 中每个字符,构造一个新的字符串 result:
- 如果字符是 小写 英文字母,则将其添加到
result中。 - 字符
'*'会 删除result中的最后一个字符(如果存在)。 - 字符
'#'会 复制 当前的result并追加到其自身后面。 - 字符
'%'会 反转 当前的result。
返回最终字符串 result 中第 k 个字符(下标从 0 开始)。如果 k 超出 result 的下标索引范围,则返回 '.'。
示例 1:
输入: s = "a#b%*", k = 1
输出: "a"
解释:
i |
s[i] |
操作 | 当前 result |
|---|---|---|---|
| 0 | 'a' |
添加 'a' |
"a" |
| 1 | '#' |
复制 result |
"aa" |
| 2 | 'b' |
添加 'b' |
"aab" |
| 3 | '%' |
反转 result |
"baa" |
| 4 | '*' |
删除最后一个字符 | "ba" |
最终的 result 是 "ba"。下标为 k = 1 的字符是 'a'。
示例 2:
输入: s = "cd%#*#", k = 3
输出: "d"
解释:
i |
s[i] |
操作 | 当前 result |
|---|---|---|---|
| 0 | 'c' |
添加 'c' |
"c" |
| 1 | 'd' |
添加 'd' |
"cd" |
| 2 | '%' |
反转 result |
"dc" |
| 3 | '#' |
复制 result |
"dcdc" |
| 4 | '*' |
删除最后一个字符 | "dcd" |
| 5 | '#' |
复制 result |
"dcddcd" |
最终的 result 是 "dcddcd"。下标为 k = 3 的字符是 'd'。
示例 3:
输入: s = "z*#", k = 0
输出: "."
解释:
i |
s[i] |
操作 | 当前 result |
|---|---|---|---|
| 0 | 'z' |
添加 'z' |
"z" |
| 1 | '*' |
删除最后一个字符 | "" |
| 2 | '#' |
复制字符串 | "" |
最终的 result 是 ""。由于下标 k = 0 越界,输出为 '.'。
提示:
1 <= s.length <= 105s只包含小写英文字母和特殊字符'*'、'#'和'%'。0 <= k <= 1015- 处理
s后得到的result的长度不超过1015。
解题方法:正算长度反定位
本题的翻转操作和复制操作时间复杂度都是$O(n)$,且复制操作会导致字符串长度倍增,指数级别的增长还是很可怕的。因此在本题II中,我们不能再像I那样继续纯模拟了。好在题目只需要返回一个下标的结果,所以我们只需要盯着这个目标下标看就好。
首先我们可以正着模拟一遍字符串的变换过程,我们只计算长度不考虑字符串中的元素是什么:
1 | |
这样方便我们溯源最终的下标k究竟来自哪里。首先如果k大于最终字符串长度l我们可以直接返回.,否则一定能溯源到对应的字母。
诶,溯源?那不就是反向定位吗?既然我们知道了最终字符串的长度以及我们关注的唯一一个下标,那么我们是不是可以一直只关注这一个下标并反向操作,直到我们知道这个下标对应的字母呢?
当然可以!就反向操作呗。这个字母的“终极源头”来自哪里?一定来自某一次的字母追加操作(即某次追加了一个小写字母,这个追加字母的位置正是我们所关注的位置)。
1 | |
然后这道题就解啦!
有人问,在处理删除操作的逆操作时,我们无脑地把字符串长度增加了1。但其实正向处理删除操作时,可能由于字符串本来就是空所以根本就没删掉字符呀!
真棒!说明你真的理解了这道题的解法。但是无需担心,因为只要k位置合法,我们就一定能在反向操作时字符串删空之前确定k的值!
你想,正向操作时某一刻把字符串删没了,那么是不是相当于前面的操作我们压根不用管呀?相当于从这一刻起重新开始了呗。
以上。
- 时间复杂度$O(len(s))$
- 空间复杂度$O(1)$
AC代码
C++
1 | |
Python
1 | |
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源