c++ 数组的输入遇到特定字符停止输入_leetcode394. 字符串解码

该博客详细介绍了如何利用栈结构解决LeetCode上的394题,即字符串解码问题。面对存在括号重叠的复杂情况,通过维护一个栈来保存解码过程中的信息,当遇到右括号时,完成复制操作。文章通过实例解析并提供了代码实现,解释了如何处理数字、字符和括号,确保解码的正确性。
摘要由CSDN通过智能技术生成

leetcode394. 字符串解码

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例:

s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".

方法:栈

思路:

本题的难点在于存在括号重叠的情况,比如第二个示例,如果都是第一个示例一样,那么很好解答。出现第二个示例这种情况,需要考虑[c]这个括号元素复制之后,还需要与前面的a一起,进行下一次复制。第一个括号“[”先进后出,这与栈结构一致,所以我们使用堆栈结构解决这个问题。

我们使用ans维护答案,numm维护遍历到的这个括号前面的数,stack堆栈保存一个个数组[numm,ans],numm为这个括号前面的数,ans为到这个括号前的答案,方便之后进行拼接,因为只有括号内部的字符才会被复制,而且如果遇到示例2那种情况,c是需要复制的,相对于这个括号来说,a不需要复制,但是a相对于外面的括号,是需要复制的,所以我们需要使用ans来保存,而不能使用别的变量,因为你不知道ans需不需要复制,遇到右括号,就需要复制。我们遍历字符串s,每个字符设为c

当我们遇到数字的时候:我们对numm进行更新,numm * 10 + c

当我们遇到左括号的时候:这时,说明后面的需要复制了,入栈[numm,ans],然后numm = 0;ans = '',清零。

当我们遇到字符时:这时是需要复制的字符串,ans += c

当我们遇到右括号的时候:这时,需要完成复制了,对最后入栈的弹出,temp = stack.pop(),ans = temp[0] * ans + temp[1]

最后返回ans即可。

下面以实例二为例,画图解释。

df3578169c786ab1060f162d113d5a92.png

fd13a6638a97401f2b471b13b4e18cdd.png

1fce45cc515f11e07dc50431fbe423ee.png

31a2b0c9bb806b8d44442ed181c977b9.png

2eef05158482689ca127ce9433701e70.png

7f26975cce0840d5e65ee2cb5678b513.png

a4f4dffcfbbb933809a30b7679e51c23.png

代码:

class 

结果:

cdea365395bc3a35a60d5b0d9a1ec27a.png
KMP算法是一种字符串匹配算法,用于在一个文本串S内查找一个模式串P的出现位置。它的时间复杂度为O(n+m),其中n为文本串的长度,m为模式串的长度。 KMP算法的核心思想是利用已知信息来避免不必要的字符比较。具体来说,它维护一个next数组,其中next[i]表示当第i个字符匹配失败时,下一次匹配应该从模式串的第next[i]个字符开始。 我们可以通过一个简单的例子来理解KMP算法的思想。假设文本串为S="ababababca",模式串为P="abababca",我们想要在S中查找P的出现位置。 首先,我们可以将P的每个前缀和后缀进行比较,得到next数组: | i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | --- | - | - | - | - | - | - | - | - | | P | a | b | a | b | a | b | c | a | | next| 0 | 0 | 1 | 2 | 3 | 4 | 0 | 1 | 接下来,我们从S的第一个字符开始匹配P。当S的第七个字符和P的第七个字符匹配失败时,我们可以利用next[6]=4,将P向右移动4个字符,使得P的第五个字符与S的第七个字符对齐。此时,我们可以发现P的前五个字符和S的前五个字符已经匹配成功了。因此,我们可以继续从S的第六个字符开始匹配P。 当S的第十个字符和P的第八个字符匹配失败时,我们可以利用next[7]=1,将P向右移动一个字符,使得P的第一个字符和S的第十个字符对齐。此时,我们可以发现P的前一个字符和S的第十个字符已经匹配成功了。因此,我们可以继续从S的第十一个字符开始匹配P。 最终,我们可以发现P出现在S的第二个位置。 下面是KMP算法的C++代码实现:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值