LeetCode刷题—— 字符串解码#394#Medium

字符串解码题目的思路探讨与源码
     字符串解码的题目如下图,该题属于栈和递归类型的题目,主要考察对于栈和递归方法的使用和理解。本文的题目作者想到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版本的栈辅助方法的速度也还可以,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。

おすすめ

転載: blog.csdn.net/qq_26727101/article/details/119963647