力扣面试150题--有效的括号和简化路径

Day 29

题目描述

思路

根据题目要求,字符串如果是合法,需要满足三个条件,这里最重要的是第二个条件,括号必须按照正确顺序闭合,也就是({)}这种情况是不合法的,因此有以下做法:

  1. 创建一个栈用来存放左括号left
  2. 从前向后遍历字符串
  3. 如果为左括号,就加入到栈中
  4. 如果为右括号,判断栈中是否有元素(无元素返回false),有元素就取出顶部元素,如果不匹配(返回false),匹配就继续遍历字符串
  5. 遍历结束后,如果左括号栈不为空,也返回false
  6. 最后如果左括号为空,返回true。
java 复制代码
class Solution {
     public boolean isValid(String s) {
        Stack<Character> left = new Stack<>();
        char c;
        for (int i = 0; i < s.length(); i++) {
            c = s.charAt(i);
            if (c == '(' || c == '{' || c == '[') {
                left.push(c);
            }
            else if (c == ')'){
                if (!left.isEmpty()&&left.peek() == '(') {
                    left.pop();
                }
                else{
                   return false;
                }
            }
            else if (c == '}'){
                if (!left.isEmpty()&&left.peek() == '{') {
                    left.pop();
                }
                else{
                    return false;
                }
            }
            else{
                if (!left.isEmpty()&&left.peek() == '[') {
                    left.pop();
                }
                else{
                    return false;
                }
            }
        }
        if(left.isEmpty()){
            return true;
        }
        else return false;
    }
}

题目描述

思路

难点 :此题难点在于如何处理返回上一级文件夹,而且可能出现/d/c/./b/。。/。。/a这种情况,需要连续返回两个文件夹.(结果应该返回/d/a)
初次思路 :首先对于这个给出的字符串,有用的信息即为文件名(包括。,。。,。。。),我的想法是创建一个栈,依次取出文件名加入到栈中,依次弹出栈后单独处理/即可

做法:

  1. 创建一个栈来存放文件名,创建一个res来存放结果
  2. 从头开始遍历字符串,依次取出文件名(这段建议看看代码)
  3. 遍历栈,取出栈顶文件名,弹出栈顶。
  4. 如果栈顶文件名为。。(最麻烦的一种情况),创建一个计数器初始为1,记录之后弹出的元素中有几个。。,
  5. 取出栈顶元素,如果为。。,计数器加1,弹出栈,重复以上操作,直到栈顶元素不为。。
  6. 此时我们有计数器,循环弹出,直到计数器为0,我们还得接着弹出栈,弹出栈可能存在三种情况,如果为弹出的栈顶元素为 。,什么都不做,因为根据题意。是要被省略的;如果弹出栈顶元素 为。。,计数器加1;如果弹出元素为其他,计数器-1
  7. (续4)如果栈顶为。,直接弹出栈顶元素,不处理
  8. 如果栈顶为其他,说明这个是我们要找的文件名, res='/'+filrname+res保存结果(这样可以满足起始为/,结尾不为/)
  9. 遍历结束时,如果res为空,则加一个/(可能/。的情况)
    10.返回res
java 复制代码
class Solution {
    public String simplifyPath(String path) {
       Stack<String> file = new Stack<>();
        String filrname="";
        String res="";
        int x=0;
        for (int i = 0; i < path.length(); i++) {//取出文件名
            if (path.charAt(i) != '/') {
                filrname=filrname+path.charAt(i);
            }
            else {
                if(!filrname.equals("")){//防止存入空值
                    file.add(filrname);
                    filrname="";
                }
            }
        }
        if(!filrname.equals("")){//因为最后一个文件名后可能不存在/,单独处理一下
            file.add(filrname);
        }//将所有的文件名加入到了栈中
        if(file.isEmpty()){
            res="/";
            return res;
        }
        while (!file.isEmpty()) {//遍历栈
            filrname=file.peek();
            file.pop();
           if(filrname.equals("..")){//说明要跳过栈中的下一个元素
               int sum=1;//还要跳过的元素
               while(!file.isEmpty()){
                 if(file.peek().equals("..")){//弹出。。,记录还要跳过的元素的个数
                     sum++;
                     file.pop();
                 }
                 else{//不为。。就终止
                     break;
                 }
               }
               while (sum!=0){
                   if(!file.isEmpty()){//防止报错
                       if(file.peek().equals(".")){//省略
                           file.pop();
                       }
                       else if(file.peek().equals("..")){//还得弹出,计数器加一
                           file.pop();
                           sum++;
                       }
                       else{//计数器-1
                           file.pop();
                           sum--;
                       }

                   }
                   else{
                       break;
                   }
               }
            }
            else if(filrname.equals(".")){
                //不处理
            }
            else{//加入到结果字符串
                res='/'+filrname+res;
            }
        }
        if(res.equals("")){//防止/。
            res="/";
        }
        return res;  
    }
}
相关推荐
hetao17338373 小时前
2026-09-01~09-04 hetao1733837 的刷题记录
c++·算法
Evand J3 小时前
【MATLAB例程,图像滤波5】 反谐波均值滑动窗口滤波(CHMF)图像降噪与质量评价,附代码下载链接
图像处理·算法·计算机视觉·matlab·均值算法·滑动窗口滤波·均值滑动
lee_curry4 小时前
AI Agent 工程师完整学习路线(面向生产级项目与面试)
人工智能·学习·ai·面试·agent
血小板要健康4 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
江湖十年4 小时前
在 Go 中使用 dyno 包处理动态对象
后端·面试·go
a187927218314 小时前
【算法】回溯算法(三):三记重锤与 N 皇后——记忆化、状态设计与三层漏斗
算法·leetcode·go·剪枝·回溯·n皇后·算法讲解
数智启示录5 小时前
PostgreSQL 内存调优实战(第 12 篇):work_mem 只调大 64 倍,峰值为什么远不止 64 倍
运维·数据库·经验分享·postgresql·面试
HugoStudio_SWAN6 小时前
洛谷 P1420 / P1179 / B4262 最长连号、数字统计与词频统计——统计的三种面孔
c++·学习·程序人生·算法
青 春 记 忆7 小时前
LeetCode 350. 两个数组的交集 II|Python 解法详解
python·算法·leetcode
刀法如飞7 小时前
《理解道德经》简版第5章:天地不仁,以万物为刍狗
面试·机器人