牛客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;
    }
}
相关推荐
Coovally AI模型快速验证26 分钟前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
pusue_the_sun30 分钟前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao341 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
zhangfeng11331 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
啊阿狸不会拉杆2 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路3 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法
你知道网上冲浪吗3 小时前
【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架
python·算法·数学建模·数值分析
地平线开发者5 小时前
征程 6 | PTQ 精度调优辅助代码,总有你用得上的
算法·自动驾驶
Tisfy5 小时前
LeetCode 837.新 21 点:动态规划+滑动窗口
数学·算法·leetcode·动态规划·dp·滑动窗口·概率
CoovallyAIHub6 小时前
为高空安全上双保险!无人机AI护航,YOLOv5秒判安全带,守护施工生命线
深度学习·算法·计算机视觉