算法day25

第一题

394. 字符串解码

解法:模拟栈的完成上述的操作;

分析:

下面以如图的字符串来分析;

首先定义一个数字栈用来存放数字,同时定义一个容器stringbuffer栈,里面用来存放字符串;

1、遇到数字:将这个数字进栈操作到数字栈中;

2、遇到'【'符号,将【符号后面的字符串提取出来,放入到字符串栈中;

3、遇到'】':首先将此时字符串栈顶的字符串拿出来,进行解析,根据数字栈栈顶的数字来重复刚取出来的字符串,最后将解析好的字符串放在字符串栈顶;

4、遇到单独的字符:将这个单独的字符串直接放在字符串栈顶字符的后面;

小细节:如果遇到的数字是非单位数,我们要能够完整的获取到这个多位数的数字;

综上所述,代码如下:

java 复制代码
class Solution {
    public String decodeString(String s) {
        Stack<StringBuffer> st = new Stack<>();
        st.push(new StringBuffer());//先放一个空串
        Stack<Integer> nums = new Stack<>();
        int i = 0,n = s.length();
        char[] s1 = s.toCharArray();
        while(i < n){
            //遇到数字
            if(s1[i] >= '0' && s1[i] <= '9' ){
                int tmp = 0;
                while(i < n && s1[i] >= '0' && s1[i] <= '9' ){
                    tmp = tmp * 10 + (s1[i] - '0');
                    i++;
                }
                nums.push(tmp);
            }
            else if(s1[i] == '['){
                i++;//把后面的字符串提取出来
                StringBuffer tmp = new StringBuffer();
                while(i < n && s1[i] >= 'a' && s1[i] <= 'z' ){
                    tmp.append(s1[i]);
                    i++;
                }
                st.push(tmp);
            }
            else if(s1[i] == ']'){
                //解析字符串
                StringBuffer tmp = st.pop();
                int num = nums.pop();
                while(num-- != 0){
                   st.peek().append(tmp);
                }
                i++;
            }
            else{
                StringBuffer tmp = new StringBuffer();
                while(i < n && s1[i] >= 'a' && s1[i] <= 'z' ){
                    tmp.append(s1[i]);
                    i++;
                }
                st.peek().append(tmp);
            }

        }
        return st.peek().toString();
    }
}

第二题

解法:模拟栈的基本运行逻辑

步骤:

1、让元素一直进栈操作

2、定义指针来指向popped数组的0号位置元素,在进栈后判断栈顶元素是否和出栈元素的指针所指的元素相同,如果相同,则进行出栈操作;如果不同则指针位置向后移动一个位置,接着进行入栈操作;

综上所述,代码如下:

java 复制代码
class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Stack<Integer> st = new Stack<>();
        int i = 0,n = popped.length;
        for(int x : pushed){
            st.push(x);
            while(!st.isEmpty() && st.peek() == popped[i]){
                st.pop();
                i++;
            }
        }
        return i == n;
    }
}

ps:本次的内容就到这里了,如果对你有所帮助的话,就请一键三连哦!!!

相关推荐
StickToForever6 分钟前
第4章 信息系统架构(五)
经验分享·笔记·学习·职场和发展
计算机小白一个2 小时前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
万事可爱^3 小时前
HDBSCAN:密度自适应的层次聚类算法解析与实践
算法·机器学习·数据挖掘·聚类·hdbscan
欧了1114 小时前
洛谷P9240 [蓝桥杯 2023 省 B] 冶炼金属
职场和发展·蓝桥杯·洛谷·蓝桥杯大学b组c语言
大数据追光猿5 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Dream it possible!5 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
夏末秋也凉5 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode
南宫生5 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
柠石榴5 小时前
【练习】【回溯No.1】力扣 77. 组合
c++·算法·leetcode·回溯
Leuanghing5 小时前
【Leetcode】11. 盛最多水的容器
python·算法·leetcode