Decode String

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/king_qg/article/details/82941744

Decode String

example

s = "3[a]2[bc]", return "aaabcbc".
s = "3[a2[c]]", return "accaccacc".
s = "2[abc]3[cd]ef", return "abcabccdcdcdef".

思路

这其实就是四则运算表达式的变形。   
3[a]2[bc] == 3*(a)+2*(bc)   
3[a2[c]] == 3*(a+2*(c))
2[abc]3[cd]ef == a*(abc)+3*(cd)+ef   
四则运算表达式运用两个栈就可以求出结果,一个放操作数,一个放运算符。   
由于这是字符串所以加的操作就省了,把乘的结果放回操作数那个栈就相加了。   
所以我们只需要一个栈就可以了。

代码

//根据栈中的内容取出需要做乘法运算的两个操作数
func getSOpt(src []byte) (int, string) {
	var err error

	var retInt int
	var retStr string

	index := len(src) - 1
	for src[index] != '[' {
		index--
	}

	//t的索引是'['的位置索引
	t := index
	retStr = string(src[t+1:])
	index--

	for {
		_, err = strconv.Atoi(string(src[index]))
		//数字的边界分两种
		//1 在中间位置遇到了不是数字的字符,
		//2 数字已经到了字符串最前的位置
		if err != nil || index == 0 {
			break
		}
		index--
		continue
	}

	start := index
	if err != nil {
		start += 1
	}
	retInt, _ = strconv.Atoi(string(src[start:t]))

	return retInt, retStr
}

func decodeString(s string) string {
	var tem []byte
	var rep int

	for i := 0; i < len(s); i++ {

		if s[i] == ']' {
			var tep string

			//得到需要参与乘法运算的两个操作数
			rep, tep = getSOpt(tem)

			//计算需要剔除的长度信息,
			j := len(tem) - len(tep) - len(strconv.Itoa(rep)) - 1

			//把无用的字符从栈中取出,防止取出后为空栈
			if j == 0 {
				tem = []byte{}
			} else {
				tem = tem[:j]
			}

			//把乘的结果写入栈,并且和之前需要做加法的字符放在一起,相当于直接做了加法
			for t := 0; t < rep; t++ {
				tem = append(tem, tep[:]...)
			}
			continue
		}

		tem = append(tem, s[i])
	}

	return string(tem)
}

猜你喜欢

转载自blog.csdn.net/king_qg/article/details/82941744