牛客NC199 字符串解码【中等 递归,栈的思想 C++/Java/Go/PHP】

题目

题目链接:

https://www.nowcoder.com/practice/4e008fd863bb4681b54fb438bb859b92

相同题目:

https://www.lintcode.com/problem/575

思路

复制代码
解法和基础计算器1,2,3类似,递归

参考答案C++

cpp 复制代码
struct Info {
    string str;
    int stopindex;
    Info(string e, int c) : str(e), stopindex(c) {}
};

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return string字符串
     */
    string decodeString(string s) {
        //解法和基础计算器1,2,3类似,递归
        return process(s, 0).str;
    }

    Info process(string s, int idx) {
        string str;
        int cur = 0;
        while (idx < s.size() && s[idx] != ']') {
            char c = s[idx];
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                str += c;
                idx++;
            } else if (c >= '0' && c <= '9') {
                cur = cur * 10 + int(c - '0');
                idx++;
            } else { //遇到[  需要递归获取[...] 的结果
                Info info = process(s, idx + 1);
                str += getStr(info.str, cur);
                cur = 0;
                idx = info.stopindex + 1;
            }
        }

        return Info(str, idx);
    }

    string getStr(string s1, int count) {
        string ans;
        for (int i = 0; i < count; i++) {
            ans += s1;
        }
        return ans;
    }
};

参考答案Java

java 复制代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return string字符串
     */
    public String decodeString (String s) {
        //解法和基础计算器1,2,3类似,递归
        return process(s, 0).ans;
    }

    public Info process(String s, int i) {
        StringBuilder ans = new StringBuilder();
        int cur = 0;
        while (i < s.length() && s.charAt(i) != ']') {
            char c = s.charAt(i);
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                ans.append(c);
                i++;
            } else if (c >= '0' && c <= '9') {
                cur = cur * 10 + c - '0';
                i++;
            } else { //遇到[
                Info next = process(s, i + 1);
                ans.append(getStr(next.ans, cur));
                cur = 0;
                i = next.stopIndex + 1;
            }
        }
        return new Info(ans.toString(), i);
    }

    public String getStr(String str, int count) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < count ; i++) {
            sb.append(str);
        }

        return sb.toString();
    }


    static class Info {
        String ans;
        int stopIndex;
        public Info(String s, int e) {
            ans = s;
            stopIndex = e;
        }
    }
}

参考答案Go

go 复制代码
package main

import "bytes"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param s string字符串
 * @return string字符串
 */
func decodeString(s string) string {
	//本答案和解答基础计算器1,2,3的思路类似
	//递归。遇到字母,遇到数字,遇到[  三种情况
	return process(s, 0).str
}

func process(s string, idx int) Info {
	var buf bytes.Buffer
	cur := 0

	for idx < len(s) && s[idx] != ']' {
		c := s[idx]
		if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') {
			buf.WriteString(string(c))
			idx++
		} else if c >= '0' && c <= '9' {
			cur = cur*10 + int(c-'0')
			idx++
		} else { //遇到[  递归去吧,我需要递归的结果
			info := process(s, idx+1)
			buf.WriteString(getStr(info.str, cur))
			cur = 0
			idx = info.stopindex + 1
		}
	}

	return Info{buf.String(), idx}
}

func getStr(str string, count int) string {
	var buf bytes.Buffer
	for i := 0; i < count; i++ {
		buf.WriteString(str)
	}

	return buf.String()
}

type Info struct {
	str       string
	stopindex int
}

参考答案PHP

php 复制代码
<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 
 * @return string字符串
 */
function decodeString( $s )
{
     //本答案和解答基础计算器1,2,3的思路类似
    //递归。遇到字母,遇到数字,遇到[  三种情况

    return process($s,0)->str;
}

function process($s,$idx) {
    $str ='';
    $cur=0;
    while ($idx <strlen($s) && $s[$idx] !=']') {
        $c = $s[$idx];
        if(($c>='a' && $c<='z') ||($c>='A' && $c <='Z')){
            $str.=$c;
            $idx++;
        }else if($c>='0' && $c<='9'){
            $cur =$cur*10+intval($c-'0');
            $idx++;
        }else{ //遇到[ 了,递归获取[...] 中等的结果
            $info = process($s,$idx+1);
            $str.=(getStr($info->str,$cur));
            $cur =0;
            $idx = $info->stopindex+1;
        }
    }
    return new Info($str,$idx);
}

function getStr($s,$count){
    $str = '';
    for($i=0;$i<$count;$i++){
        $str.=$s;
    }
    return $str;
}

class Info{
    public $str;
    public $stopindex;
    public function __construct($a,$b){
        $this->str = $a;
        $this->stopindex = $b;
    }
}
相关推荐
聚客AI5 小时前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v7 小时前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工9 小时前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农11 小时前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了11 小时前
AcWing学习——双指针算法
c++·算法
moonlifesudo11 小时前
322:零钱兑换(三种方法)
算法
NAGNIP1 天前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队1 天前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja1 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下1 天前
最终的信号类
开发语言·c++·算法