字符串解码:给一个字符串,返回解码后的字符串。

这篇具有很好参考价值的文章主要介绍了字符串解码:给一个字符串,返回解码后的字符串。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

字符串解码,给一个字符串s,返回解码后的字符串。字符串编码规则为k[str]表示括号内部str字符串正好重复k次,k保证为整数,并且输入的字符串肯定符合这种编码规则不会有额外的空格。
注意事项:

  • 注意括号可能发生嵌套,例如输入字符串为3[a2[c]]应该返回accaccacc
  • 1 <= s.length <= 30
  • s由小写英文字母、数字和方括号'[]' 组成
  • s保证是一个有效的输入。左括号前肯定指明了重复次数,对于不重复的字符串不会用括号将它括住。
  • s中所有整数的取值范围为[1, 300]

输入输出

输入 输出
3[a]2[bc] aaabcbc
abc3[d2[e]] abcdeedeedee

初步分析

因为嵌套括号的可能性,所以这道题需要使用数据结构,一个栈保存数字代表重复的次数,一个栈保存当前需要重复拼接的字符串。

我的思路

使用List集合存储每个数字,然后没有考虑到临时字符串的存储。没有理解到这道题的核心思想:当发生嵌套括号时,需要从最内层的元素向外拼接。从内向外

题解思路

  • countStack栈存储需要重复的次数,stringStack栈存储当前的临时字符串。
  • 创建StringBuilder对象curStr为当前拼接的字符串,用于应对连续字符的情况,例如2[abc]
  • 创建整形count记录每个重复次数,例如2[a3[b]]则压栈顺序为:2--->3
  • 将目标字符串转为char数组进行遍历,依次判断每个字符情况。
  • 最终curStr是拼接完成的,解密后的字符串,返回。

关键点

第四步,遇到特定字符该做什么?
我们先假设最理想情况:e10[a]3[b]abc

//首先判断字符是数字的情况
if(Character.isDigit(ch)){
    //将字符转为对应的10进制数字,因为重复次数范围在1~300
    int count = 0;
    count = count * 10 + ch - '0';
    //但这里不能判断是否应该将count压栈,因为无法确定ch后面是否还有数字
}
//2.判断ch = '['情况
if(ch == '['){
    //匹配到左括号,肯定代表count已经固定得到了,将其压栈
    countStack.push(count);
    //因为第一个左括号前可能有未在括号内的字符串,也就是重复次数为1的字符串,所以需要将当前字符串压栈
    stringStack.push(curStr);
    //当前字符串已记录,让其恢复为空字符串
    curStr = new StringBuilder();
    //count也需要还原
    count = 0;
}
//3.判断ch是字母的情况
if(Character.isLetter(ch)){
    curStr.append(ch);
}
//4.判断ch = ']'右括号
if(ch == ']'){
    //每当匹配到右括号,算是一个终结条件,无论多少个括号嵌套,当匹配到右括号时后面一定都是右括号直到结束
    /*当前栈、curStr、count的情况
    countStack [10]
    stringStack ["e"]
    curStr  "a"
    count    0
    */
    //观察本次输入范例,我们需要在e后面拼接10个a字符
    count = countStack.pop();
    StringBuilder temp = new StringBuilder(stringStack.pop());
    for(int i=0;i<count;i++){
        temp.append(curStr);
    }
    curStr = temp;
    count = 0;
}

根据上面代码我们再分析这种情况a2[b3[c]]结果应该为abcccbccc

//第一次匹配到]
/*
    countStack [2,3] 栈顶为3
    stringStack ["a","b"] 栈顶为"b"
    curStr  "c"
    count    0
*/
//第二次匹配到]
/*
    countStack [2] 栈顶为2
    stringStack ["a"] 栈顶为"a"
    curStr  "bccc"
    count    0
*/
//第二次执行完后
curStr = "abcccbccc"

图解

字符串解码:给一个字符串,返回解码后的字符串。文章来源地址https://www.toymoban.com/news/detail-560930.html

代码

public class DecodeStr {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(getResult(str));
    }

    private static String getResult(String s) {
        Stack<Integer> countStack = new Stack<>();
        Stack<String> stringStack = new Stack<>();
        //最终返回的就是他
        StringBuilder curStr = new StringBuilder();
        int count = 0;
        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)){
                count = count * 10 + (c - '0');
            }else if (c == '['){
                countStack.push(count);
                stringStack.push(curStr.toString());
                curStr = new StringBuilder();
                count = 0;
            }else if (c == ']'){
                //找到了最内部的字符串,从stringStack中弹出
                StringBuilder decodedString = new StringBuilder(stringStack.pop());
                //寻找该字符串重复次数
                int repeatCount = countStack.pop();
                for (int i = 0; i < repeatCount; i++) {
                    decodedString.append(curStr);
                }
                curStr = decodedString;
            }else {
                curStr.append(c);
            }
        }
        return curStr.toString();
    }
}

到了这里,关于字符串解码:给一个字符串,返回解码后的字符串。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2023-05-21:给定一个字符串 s 和一个整数 k 。你可以从 s 的前 k 个字母中选择一个, 并把它加到字符串的末尾。 返回 在应用上述步骤的任意数量的移动后,字典上最小的字符串。 输入:s

    2023-05-21:给定一个字符串 s 和一个整数 k 。你可以从 s 的前 k 个字母中选择一个, 并把它加到字符串的末尾。 返回 在应用上述步骤的任意数量的移动后,字典上最小的字符串。 输入:s = \\\"baaca\\\", k = 3。 输出:\\\"aaabc\\\"。 答案2023-05-21: 1.当 k 大于 1 时,直接将字符串 s 中的字符

    2024年02月05日
    浏览(32)
  • 【群答疑】jmeter关联获取上一个请求返回的字符串,分割后保存到数组,把数组元素依次作为下一个请求的入参...

    一个非常不错的问题,来检验下自己jmeter基本功 可能有同学没看懂题,这里再解释一下,上面问题需求是:jmeter关联获取上一个请求返回的字符串,分割后保存到数组,把数组元素依次作为下一个请求的入参 建议先自己思考,如果2小时没做出来,可以参考文末评论区的实现

    2024年02月09日
    浏览(28)
  • 后端数据配置相对路径,前端添加网站根 URL (根路径)- js获取网站项目根路径- 获取根路径后的第一个斜杠前 / 的项目- - 判断url包含某字符串

    js获取项目根路径,如下: 原 http://localhost:8080/testproject/test.html 根路径: http://localhost:8080 1. js获取网站项目根路径

    2024年02月10日
    浏览(33)
  • 【数据结构-字符串 三】【栈的应用】字符串解码

    废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【字符串转换】,使用【字符串】这个基本的数据结构来实现,这个高频题的站点是: CodeTop ,筛选条件为: 目标公司+最近一年+出现频率排序 ,由高到低的去 牛客TOP101 去找,只有两个

    2024年02月07日
    浏览(66)
  • 【LeetCode】394.字符串解码

    给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为:  k[encoded_string] ,表示其中方括号内部的  encoded_string  正好重复  k  次。注意  k  保证为正整数。 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

    2024年02月11日
    浏览(31)
  • 【经典面试】87 字符串解码

    给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string] ,表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。 此外,你

    2024年02月08日
    浏览(34)
  • 力扣2696. 删除子串后的字符串最小长度

    Problem: 2696. 删除子串后的字符串最小长度 可以知道能够消除的只有AB 和CD 的者两种排列顺序方式,但是也许在发生一次消除后还会引发后续的消除可能性。 元素从前向后进行检测,如果是A或者C进行标记入栈,然后传入的如果是与之对应的B或者D,则达成消除,如果不是也直

    2024年01月25日
    浏览(38)
  • Python字符串的编码和解码

    不同计算机之间进行数据传输,实际上传输的是二进制数据。 将str类型转换成bytes类型,需要用到字符串的encode()方法 Str.encode(encoding=’utf-8’,                Errors=’strict/ignore/replace’) 将bytes类型转换成str类型,需要用到bytes类型的decode()方法 Bytes.decode(encodin

    2024年01月22日
    浏览(34)
  • 【LeetCode2696】删除子串后的字符串最小长度

    【题目链接】 标签: 栈 、 字符串 、 模拟 难度: 简单 给你一个仅由 大写 英文字符组成的字符串 s 。 你可以对此字符串执行一些操作,在每一步操作中,你可以从 s 中删除 任一个 “AB” 或 “CD” 子字符串。 通过执行操作,删除所有 “AB” 和 “CD” 子串,返回可获得的

    2024年01月17日
    浏览(27)
  • LeetCode 2696. 删除子串后的字符串最小长度

    1、题目描述 给你一个仅由  大写  英文字符组成的字符串  s  。 你可以对此字符串执行一些操作,在每一步操作中,你可以从  s  中删除  任一个   \\\"AB\\\"  或  \\\"CD\\\"  子字符串。 通过执行操作,删除所有  \\\"AB\\\"  和  \\\"CD\\\"  子串,返回可获得的最终字符串的  最小  可能长度

    2024年01月19日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包