Leetcode394 字符串解码 递归和非递归

news2024/11/18 16:40:53

字符串解码
https://leetcode.cn/problems/decode-string/

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

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

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

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

示例 1:

输入:s = “3[a]2[bc]” 输出:“aaabcbc”

示例 2:

输入:s = “3[a2[c]]” 输出:“accaccacc”

示例 3:

输入:s = “2[abc]3[cd]ef” 输出:“abcabccdcdcdef”

示例 4:
输入:s = “abc3[cd]xyz” 输出:“abccdcdcdxyz”

解释:这道题中,字符串的数字表示括号内的字串出现几次。字串内又可以嵌套类似的形式。

在面试,这道题有两种解法,一种是递归,另一种非递归的方式则需要栈的思想。

public class Solution {

	// 定义两个成员变量,表示原字符串和当前下标
    String src;
    int curIndex;

    @Test
    public void test() {

        List<String> t = Arrays.asList("3(a2(bc))");
        for (String s : t) {
            System.out.println("递归:" + decodeString1(s));
            System.out.println("非递归:" + decodeString2(s));
        }
    }

    private String decodeString1(String str) {
        if (str == null || str.length() == 0) {
            return "";
        }
        src = str;
        curIndex = 0;
        return recursive();
    }

    private String recursive() {

        if (curIndex == src.length() || src.charAt(curIndex) == ')') {
            return "";
        }

        String ret = "";
        int retTime = 0;
        char cur = src.charAt(curIndex);

        if (isLetter(cur)) {
            ret = String.valueOf(cur);
            ++curIndex;
        } else if (isDigit(cur)) {
            retTime = getDigit();
            curIndex++; // skip '('
            String subStr = recursive();// notice
            curIndex++; // skip ')'

            StringBuffer buf = new StringBuffer();
            while (retTime-- > 0) {
                buf.append(subStr);
            }
            ret = buf.toString();
        }

        return ret + recursive();
    }

    private int getDigit() {
        int ret = 0;
        while (isDigit(src.charAt(curIndex))) {
            ret = ret * 10 + (src.charAt(curIndex) - '0'); // notice
            curIndex++;
        }
        return ret;
    }

    private boolean isDigit(char cur) {
        if (cur >= '0' && cur <= '9') {
            return true;
        }
        return false;
    }

    private boolean isLetter(char cur) {
        if ((cur >= 'a' && cur <= 'z') || (cur >= 'A' && cur <= 'Z')) {
            return true;
        }
        return false;
    }

    // 非递归形式
    private String decodeString2(String str) {
        if (str == null || str.length() == 0) {
            return "";
        }
        src = str;
        curIndex = 0;
		// 定义一个栈,存放结果
        LinkedList<String> stk = new LinkedList<String>();

        while (curIndex < src.length()) {
            char cur = src.charAt(curIndex);
            if (isDigit(cur)) {
                int retTime = getDigit();
                stk.addLast(String.valueOf(retTime));

            } else if (isLetter(cur) || cur == '[') {
                stk.addLast(String.valueOf(cur));
                curIndex++;
            } else {
                curIndex++; // skip ]
				// 定义一个临时栈,生成子串
                LinkedList<String> subStk = new LinkedList<String>();
                while (!"[".equals(stk.peekLast())) {
                    subStk.addFirst(stk.removeLast());
                }

                String subStr = getStrFromStk(subStk); 

                stk.removeLast(); // pop '['

                int retTime = Integer.valueOf(stk.removeLast());
                StringBuffer buf = new StringBuffer();
                while (retTime-- > 0) {
                    buf.append(subStr); // 按次数重复字串
                }

                stk.addLast(buf.toString());

            }

        }

        return getStrFromStk(stk);
    }

    private String getStrFromStk(LinkedList<String> stk) {
        StringBuffer buf = new StringBuffer();
        for (String s : stk) {
            buf.append(s);
        }
        return buf.toString();
    }

}

递归结果
在这里插入图片描述
非递归结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/419311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你搞清楚了吗?| GET请求方式的长度限制到底是多少?

目录 &#x1f4cd; 浏览器限制 &#x1f4cd; 服务器限制 在大多数人的一贯认识中&#xff0c;一直认为get请求方式有2048B的长度限制&#xff0c;其实这种说法是有失偏颇的&#xff0c;甚至可以说是错误的。 这个问题一直以来似乎是被N多人误解&#xff0c;其实Http Get方…

2.3-3单链表的查找

按位查找&#xff1a; so easy (1)边界情况 i0 没有循环&#xff0c;直接返回头节点 &#xff08;2&#xff09;如果i8 当不合法&#xff0c;返回NULL. (3)普通情况i3;(平均时间复杂度为O&#xff08;n&#xff09;) 进行封装&#xff1a;避免重复&#xff0c;更加简洁更…

CRYSTALS-Dilithium

文章目录简介1和2版本区别2和3的区别1.介绍1.1基本方法概述密钥生成算法签名过程验证1.2Dilithium实现注意事项安全性。基础操作环操作模约简。元素的大小NTT域表示2.3 HashingsignatureGenζ ← {0,1}256\{{0, 1\}}^{256}{0,1}256(ρ, ρ, K) ∈ {0,1}256\{{0, 1\}}^{256}{0,1…

【springBoot篇2】springBoot日志篇

目录 一、日志有什么作用 作用1&#xff1a;快速定位问题的所在之处(最主要) 作用2&#xff1a;记录用户的登录日志 作用3&#xff1a;记录系统的操作日志 作用4&#xff1a;记录方法的执行时间 二、日志怎样使用 ①先得到日志对象(slf4j的Logger对象) ​​​编辑 ②根…

Python 无监督学习实用指南:1~5

原文&#xff1a;Hands-on unsupervised learning with Python 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关…

docker运行服务端性能监控系统Prometheus和数据分析系统Grafana

文章目录一、Prometheus的安装和运行1、使用docker拉取镜像2、创建prometheus.yml文件3、启动容器4、查看启动是否成功5、记录安装过程中出现的错误二、Grafana的安装和运行1、使用docker拉取镜像2、创建grafana3、运行grafana4、查看grafana运行日志5、登录grafana一、Prometh…

学会了selenium 模拟鼠标操作,你就可以偷懒点点点了

目录&#xff1a;导读 前言 01.ActionChains 类常用方法 02.ActionChains 类所有方法 03.ActionChains 使用步骤 04.实战 05.总结 前言 我们在做 Web 自动化的时候&#xff0c;有时候页面的元素不需要我们点击&#xff0c;值需要把鼠标移动上去就能展示各种信息。 这个…

云服务器开启声音的办法

云服务器开启声音的办法 淘小云 云计算从业者&#xff0c;架构师 ​关注 云服务器没有声音是一件很烦恼的事情&#xff0c;那么今天小编给大家分享一下服务器开启声音的方法&#xff01; 首先您需要先拥有一台windows系统的云服务器&#xff0c;小编这里以腾讯云服务器为例…

( “树” 之 DFS) 687. 最长同值路径 ——【Leetcode每日一题】

687. 最长同值路径 给定一个二叉树的 root &#xff0c;返回 最长的路径的长度 &#xff0c;这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。 两个节点之间的路径长度 由它们之间的边数表示。 示例 1: 输入&#xff1a;root [5,4,5,1,1,5] 输出&…

Loki采集Mysql errorlog,你值得拥有的错误日志聚合系统

说到分布式日志存储系统&#xff0c;大家肯定对ELK、EFK这些工具并不陌生。可是它们都基于Elasticsearch存储&#xff0c;搭建复杂&#xff0c;耗资源&#xff0c;上手难。所以&#xff0c;个人非常推崇Grafana Labs开源的Loki 轻量级日志聚合分析系统 Loki使用标签来作为索引…

java maven学习

我本身是个前端&#xff0c;目前Java都算是自学&#xff0c;为了直接能做Java服务端开发&#xff0c;我其实很多基础都没学&#xff0c;直接上项目做东西。现在来补充常用maven。避免以后出现低级错误。 一、依赖拉不下来解决步骤 1. 检查网络&#xff08;最好检查&#xff09…

Flutter(六)可滚动组件

目录1.可滚动组件简介Sliver布局模型ScrollableViewportSliver可滚动组件的通用配置2.SingleChildScrollView3.ListView默认构造函数ListView.builderListView.separated固定高度列表ListView 原理无限加载列表&#xff0c;分页添加Header4.滚动监听及控制ScrollController滚动…

SpringCloud-Alibaba学习笔记01——Nacos介绍以及注册中心的演变和Nacos核心功能

文章参考自图灵大佬课程&#xff1a;https://www.bilibili.com/video/BV1fe4y1b7ha?p1&vd_source5f425e0074a7f92921f53ab87712357b 1.什么是Nacos 官方&#xff1a;一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 …

threejs 模型 世界坐标系和设备坐标系

前言 开发中遇到需求需要点击屏幕位置处&#xff0c;生成一个类似圆形弹窗面板&#xff0c;这个交互需要进行的坐标转换为模型坐标&#xff08;局部坐标&#xff09;>场景坐标&#xff08;世界坐标&#xff09;>标准设备坐标>屏幕空间坐标&#xff0c;也就是一个将3D…

开启分片支持需要如何去做?

开启分片支持 如果您计划使您的Javashop系统数据分片&#xff0c;请参考本文档进行相应的配置。 一、做好分片策略 在开始之前&#xff0c;您应该根据自己的业务情况准备好分片策略&#xff0c;包括&#xff1a; 1、要用几个数据库来分片 2、相应的表要分几张表 在本例&#x…

大数据 | 实验一:大数据系统基本实验 | MapReduce 初级编程

文章目录&#x1f4da;实验目的&#x1f4da;实验平台&#x1f4da;实验内容&#x1f407;编程实现文件的合并和去重&#x1f407;编程实现对输入文件的排序&#x1f407;对指定的表格进行信息挖掘&#x1f4da;实验目的 1&#xff09;通过实验掌握基本的 MapReduce 编程方法。…

警惕“Money Message”勒索软件!数据安全不容忽视

近段时间&#xff0c;出现了一个名为“Money Message”的新型勒索软件&#xff0c;他们利用Money Message 病毒加密文件并以此向受害者勒索巨额赎金。 Money Message勒索软件是用 C编写&#xff0c;包含一个嵌入式JSON 配置文件&#xff0c;用于确定设备的加密方式。加密设备后…

小红书内容种草,曝光渠道分析总结

这是一个内容为王的时代&#xff0c;也是一个内容爆炸的时代。想要在以分享特色的小红书平台&#xff0c;实现内容种草&#xff0c;迅速出圈。今天来马文化传媒就从实操的角度&#xff0c;为大家带来小红书内容种草&#xff0c;曝光渠道分析总结的各种干货&#xff01; 一、什…

关于图形界面Pyqt与QT的区别选择

关于图像界面&#xff08;GUI&#xff09;想必大家都并不陌生&#xff0c;想要将一段已经完善的功能列表进行可视化操作并且具有一定的操作空间&#xff0c;将功能可视化必不可少&#xff0c;一个好的可视化工具不仅可以集成一系列小的文件功能&#xff0c;还能将不同方法之间的…

ubuntu基本环境配置及mysql8.0.32和mysql workbench安装

ubuntu基本环境配置 文章目录ubuntu基本环境配置各种依赖包下载地址一、使用root账号进行远程连接二、防火墙相关设置2.1启用2.2开放和关闭端口数据库mysql安装(8.0.32)工具mysqlworkbench(8.0.32)各种依赖包下载地址 http://cn.archive.ubuntu.com/ubuntu/pool/main/liba/lib…