394. 字符串解码

图片.png

解题思路

1 利用栈,空间换时间 countStack 记录当前的次数 alphaIndex记录当前开始的字母索引,alphaStack记录字母, 按照 次数[ 字母…] 为一个字母段,执行入栈和出栈
2 当是”]” 出栈处理,出栈按照一个字母段为部分 索引需要记录从什么位置开始出栈 也就是alphaIndex的值作用。
3 数字可能是多位数字 需要利用count =count*10 +int(s[i]-‘0’) 计算当前的字母段出现的次数

  1. func decodeString(s string) string {
  2. alphaStack := make([]byte, 0)
  3. countStack := make([]int,0)
  4. alphaIndex := make([]int,0)
  5. var count int
  6. for i:=0 ;i < len(s);i++{
  7. if s[i] >='0'&&s[i]<='9' {
  8. count =count*10 +int(s[i]-'0')
  9. }else if s[i]=='['{ // [ 后面肯定是字母
  10. // 可以把当前的数字放入次数数组
  11. countStack = append(countStack,count)
  12. count =0
  13. alphaIndex = append(alphaIndex,len(alphaStack))
  14. }else if s[i] ==']'{ // 对当前字母段出站
  15. // 获取当前字母段的次数 然后次数出栈
  16. c :=countStack[len(countStack)-1]
  17. countStack = countStack[:len(countStack)-1]
  18. // 获取当前字母段开始的索引 然后索引出栈
  19. index :=alphaIndex[len(alphaIndex)-1]
  20. alphaIndex = alphaIndex[:len(alphaIndex)-1]
  21. //获取当前的字母段
  22. str := string(alphaStack[index:])
  23. // 字母数组出站
  24. alphaStack = alphaStack[:index]
  25. for j:=0;j<c;j++{
  26. alphaStack = append(alphaStack,[]byte(str)...)
  27. }
  28. }else {
  29. alphaStack = append(alphaStack,s[i])
  30. }
  31. }
  32. return string(alphaStack)
  33. }

图片.png