题目
题目链接:
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;
}
}