字符串解码题目的思路探讨与源码
字符串解码的题目如下图,该题属于栈和递归类型的题目,主要考察对于栈和递归方法的使用和理解。本文的题目作者想到2种方法,分别是递归方法和栈辅助方法,其中递归方法使用java进行编写,而栈辅助方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
本人认为该题目可以使用递归的方法,思路就是把遇到左括号作为开启新的递归的标志,遇到的右括号作为结束一轮递归的标志并返回更新位置。首先我们初始化一个结果列表和初始位置,然后开始遍历字符串,如果遇到数字就记录,这个是重复的次数,如果遇到左括号就开始新一轮的遍历,如果遇到右括号就结束遍历并返回当前的字符串结果和下标值,直到遍历结束。那么按照这个思路我们的Java代码如下:
#喷火龙与水箭龟
class Solution {
public String decodeString(String s) {
return searchChar(s, 0)[0];
}
private String[] searchChar(String s, int jr) {
StringBuilder finalStr = new StringBuilder();
int lenNum = 0;
while(jr < s.length()) {
if(s.charAt(jr)>='0' && s.charAt(jr)<='9'){
String nowNum = String.valueOf(s.charAt(jr));
lenNum = lenNum*10+Integer.parseInt(nowNum);
}
else if(s.charAt(jr)=='[') {
String[] tpArr = searchChar(s,jr+1);
jr = Integer.parseInt(tpArr[0]);
while(lenNum>0) {
finalStr.append(tpArr[1]);
lenNum=lenNum-1;
}
}
else if(s.charAt(jr) == ']')
return new String[] { String.valueOf(jr), finalStr.toString() };
else
finalStr.append(String.valueOf(s.charAt(jr)));
jr=jr+1;
}
return new String[] { finalStr.toString() };
}
}
显然,我们还可以使用辅助栈的方法进行处理,首先初始化一个列表和最终结果,然后开始遍历字符串,如果遇到左括号,则在栈尾部加入当前的乘数和字符串结果,并且把乘数和初始值赋值为0和空字符串,如果遇到右括号就弹出尾端元素,并记录当前结果,如果遇到数字就记录乘数,否则就把结果加上当前元素,直到遍历结束并返回字符串结果。所以根据这个思路就可以写出代码,下面是Python代码部分:
#喷火龙与水箭龟
class Solution:
def decodeString(self, s: str) -> str:
stackList=[]
finalStr=''
lenNum=0
for kr in s:
if(kr=='['):
stackList.append([lenNum, finalStr])
finalStr=''
lenNum=0
elif(kr==']'):
ind,tc=stackList.pop()
finalStr=tc+ind*finalStr
elif('0'<=kr<='9'):
lenNum=lenNum*10+int(kr)
else:
finalStr=finalStr+kr
return finalStr
从结果来说java版本的递归方法的速度比较不错,而python版本的栈辅助方法的速度也还可以,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。