算法:字符串解码

本文介绍了如何解码编码字符串的方法,包括两种思路:递归和栈。递归方法通过跟踪位置信息来处理字符串重复,而栈方法利用辅助栈进行回溯和循环运算。对两种方法的时间和空间复杂度进行了分析。
摘要由CSDN通过智能技术生成

题目:字符串解码

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

编码规则为: 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".

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-string

分析

方法一

首先讲一下我拿到这道题的思路:递归。每一歌中括号可以是一层,然后递归返回中括号中的字符串,和外层的数字进行循环重复后继续下一个中括号。例如:2[4[ab]]3[b]

  1. 先得到2,然后递归进入第一个中括号
  2. 得到4,递归进入
  3. 得到ab,遇到]返回上一层
  4. ab进行4次重复,遇到]返回上一层
  5. 把得到的字符串进行2次重复。然后继续下一组。

思路应该是挺清晰的。但是这里有几个问题:在第五步的时候怎么确定下一组开始的位置?每一步递归,怎么确认开始的位置?我当时就卡在第一个问题,不知道如何解决。

对于第二个问题,很简单,重新写一个方法来递归,然后加入position参数即可。第一个问题有两个思路:

  1. 全局变量
  2. 在返回参数中加入

我比较喜欢第二种。因为全局变量就破坏了封装,我觉得不可取。但是返回参数,不是字符串吗,怎么附带位置信息?这里有个很好的解决方案:字符串数组。返回的字符串数组中一个保存得到的字符串,一个是数字字符串,再进行转换就可以得到位置信息了。思路到此应该就差不多了。另外的实现细节可以自己补充。

方法二

有递归,那么和递归一样思路的是什么?没错就是栈,那么我们可以使用一个辅助栈解决这个问题。思路和递归是差不多的:

  1. 遍历字符串数组并把字符放进栈。
  2. 当遍历到]时进行回溯,把中距离栈顶第一个[前的字符串拿出来
  3. 然后再遍历数字,遇到栈底或者]停止
  4. 然后进行循环运算后把字符串放进栈中
  5. 最后返回栈中的字符串

解答

方法一
fun decodeString(s: String): String{
   
    return getStrings(s,0)[0]
}
fun getStrings(s:String,i:Int):StringArray{
   
    val stringBuilder = StringBuilder()
    var num = 0
    var position = i
    while (position<s.length){
   
        if (<
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值