力扣:71. 简化路径

 栈

1.思路:在栈中只要把 / 的下标进栈和出栈就可以计算字符串中的字母,获取字符串中的字母用substring()函数根据 两个 / 的下标来确定区间。之后把符合的字母加入集合中。之后要判断值为“. ."时要删除集合中最后一个元素。之后用for循环拼接简化路径。

class Solution {
    public String simplifyPath(String path) {
        //将输入值最后加入一个/,防止输入值最后没有/进行数据截取。
        path+="/";
        String s1="";
//接收简要路径的集合
        ArrayList<String> li=new ArrayList<>();
        //栈来进行/的进栈操作来判断字符串中的规范字母值
        Stack<Integer> st=new Stack <>();
        //先进栈开头的/
        st.push(0);
        for(int i=1;i<path.length();i++){
            //判断字符为‘/‘时要把开头的下标出栈,在将当前的/的下标进行进栈操作
            if(path.charAt(i)=='/'){
                int j=st.pop();
                st.push(i);
                //判断两个/中是否有字母
                if(i-j>1){
                    //用substring来进行截取字符串
                    String d=path.substring(j+1,i);
                    //用于判断三个.和三个以上的.的路径
                     String o=path.substring(j+1,j+3);
          //如果截取的字符串为“..”。要把集合中最后一位的元素删除,如果集合没有元素就跳过
                    if(d.equals("..")){
                        if(li.isEmpty()){
                             continue;
                        }
                       li.removeLast();
                         continue;
                         //如果截取的元素为一个.或者为三个.以上时跳过就好了
                    }else if(d.equals(".")||(o.equals(".")&&i-j>3)){
                        continue;
                        //截取的部分为字母时就添加到集合中
                    }else{
                            li.add(d);
                    } 
                }
            }
        }
        //遍历集合拼接简化的路径
       for(int i=0;i<li.size();i++){
                s1+="/"+li.get(i); 
       }
       //特殊情况,当集合中没有元素要进行特殊的处理。
       if(li.size()==0){
           s1="/";
       }
  return s1;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值