71. Simplify Path

来源:互联网 发布:陈大新 矩阵理论 编辑:程序博客网 时间:2024/06/05 14:38

原题:

Given an absolute path for a file (Unix-style), simplify it.

For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

click to show corner cases.

Corner Cases:

  • Did you consider the case where path = "/../"?
    In this case, you should return "/".
  • Another corner case is the path might contain multiple slashes '/' together, such as"/home//foo/".
    In this case, you should ignore redundant slashes and return "/home/foo".
思考过程:
一开始分很多情况进行操作,后来干脆用了自动机,不同状态进行不同处理。用ArrayList实现一个栈存储已经遍历过的目录,遇到"/../"就出栈。
几个终态含义:4表示/../;6表示/./;7表示正常目录。

AC代码:
ArrayList<String> stack = new ArrayList<>();    int stackTop = -1;    String currentString = "/";    int state = 1;//标识自动机状态    public String simplifyPath(String path) {        String ret = "";        int len = path.length();        for (int i = 0;i < len;i++){            char c = path.charAt(i);            if (c != '/') currentString += c;            int[] reslutState = new int[3];            switch (state){                case 1:{                    reslutState[0] = 1;                    reslutState[1] = 2;                    reslutState[2] = 5;                    break;                }                case 2:{                    reslutState[0] = 6;                    reslutState[1] = 3;                    reslutState[2] = 5;                    break;                }                case 3:{                    reslutState[0] = 4;                    reslutState[1] = 5;//"..."算是路径                    reslutState[2] = 5;                    break;                }                case 5:{                    reslutState[0] = 7;                    reslutState[1] = 5;                    reslutState[2] = 5;                    }            }            if (state != 4 && state != 7) state = changeState(state,c,reslutState);//非终点集转换状态即可            if (state == 4 || state == 7 || state == 6)manageEndpoint(state);        }        if (currentString.charAt(currentString.length() - 1) != '/') {//处理最后一段不以'/'结尾的路径            if (state == 5)                push();            if (state == 3)                pop();        }        if (stackTop == -1) return "/";        for (int i = 0;i <= stackTop;i++) ret += stack.get(i);        return ret;    }    /*    出栈函数     */    public void pop(){        if (stackTop > -1) {            stack.remove(stackTop);            stackTop--;//遇到".."的情况要返回上级目录,也就是出栈        }    }    /*    入栈函数     */    public void push(){        String s = currentString;        stack.add(s);        stackTop++;    }    public void manageEndpoint(int state){        switch (state){//终点集要进行处理            case 4:{                pop();                break;            }            case 7 :                push();//放入此段路径        }        this.state = 1;//处理完此目录路径,恢复初始状态        currentString = "/";//当前字符串也恢复初始状态    }    public int changeState(int state,char c,int[] resultState){//用于切换自动机状态        switch (c){            case '/':{                state = resultState[0];                break;            }            case '.':{                state = resultState[1];                break;            }            default:{                state = resultState[2];            }        }        return state;    }

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 闲鱼买家以与描述不符退货怎么办 闲鱼买家申请退款又签收了怎么办 店铺买的手机是拆开过的怎么办 卖家以包装破损拒收快递怎么办 车辆迁出落户信封被自己拆开怎么办 快递签收了发现物品坏了怎么办 快递签收后发现货坏了怎么办 闲鱼退货有破损卖家要求赔偿怎么办 邮政快递收货后发现快递破损怎么办 中通把包裹发到别的省份去了怎么办 寄快递没拿单子但东西破损了怎么办 快递签收以后发现东西少了怎么办 淘宝时收到的货破损我该怎么办 淘宝买的冰箱七天无理由退货怎么办 截图放进ai中变得很模糊怎么办 买房子的贷款合同丢了怎么办 索尼9000e挂墙后面借口怎么办 想把木头锯成小块的怎么办 第一天上班交接完工作想辞职怎么办 POS机刷卡成功没打出单子怎么办 建行买的理财保险单子丢了怎么办 退休老师饭卡的钱突然少了怎么办 背驼得厉害头低的厉害怎么办 被别人举报自己碰瓷了怎么办 苹果平板微信屏幕不是全屏怎么办 大冒险告白被接受了怎么办在线阅读 手机屏锁图案密码忘了怎么办 opp手机锁屏密码忘了怎么办 宝宝的玩具里面脏了洗不到怎么办 早上起来眼睛被眼屎粘住了怎么办 魔兽世界神器满级任务放弃了怎么办 魔兽世界神器满级任务没接到怎么办 情侣空间上的照片删了怎么办 微信好友群群主把你踢出房间怎么办 我被车撞了对方把现场破坏该怎么办 美术生专业分可以文化分不行怎么办 小狗又吐又拉不吃东西怎么办 狗狗把脖子挠破了怎么办 几分钟我的手机疯狂收到短信怎么办 初中孩子沉迷动漫及画动漫画怎么办 打仗在派出所保释出来人跑了怎么办