LeetCode第71题:简化路径(中等)

LeetCode第71题:简化路径(中等)

  • 题目:以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径。请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。
    在这里插入图片描述
  • 思路一:想到了第65题有效数字的问题,为了练习练习那道题的方法,我选择了状态集的办法。让我想不到的是,目录名竟然还可以包含点(黑人问号脸???),这个点什么时候可以留下,什么时候不能有,研究了半天。。。。终于在我快累死的时候过了。。。。
class Solution {
    public int make(char c){
        switch(c){
            case '.' :return 0;
            case '/' :return 1;
            default:
                return 2;
        }
    }

    public String simplifyPath(String path) {
        String res = "";
        char[] ans = new char[path.length()];
        ans[0]='/';
        int state = 0;
        int j = 1;
        int[][] transfer = new int[][]{{ 1, 0, 2},
                                       { 3, 0, 2},
                                       { 1, 0, 2},
                                       { 2, 0, 2}};
        char[] ss = path.toCharArray();
        for(int i=1;i<ss.length;i++){
            int id = make(ss[i]);
            int stateNew=transfer[state][id];
            if(state==0){
                if(id==0){
                    ans[j++]='.';
                }else if(id==2){
                    ans[j++]=ss[i];
                }
            }else if(state==1){
                if(id==0){
                    ans[j++]='.';
                }else if(id==1){
                    if(ans[j-2]=='/'){
                        j=j-1;
                    }else if(i!=ss.length-1){
                        ans[j++]='/';
                    }
                }else if(id==2){
                    ans[j++]=ss[i];
                }
            }else if(state==2){
                if(id==0){
                    ans[j++]='.';
                }else if(id==1 && i!=ss.length-1){
                    ans[j++]='/';
                }else if(id==2){
                    ans[j++]=ss[i];
                }

            }else if(state==3){
                if(id==0){
                    ans[j++]='.';
                }else if(id==1){
                    if(j>4){
                        j=j-4;
                        while(j>0 && ans[j] != '/'){
                            j--;
                        }
                        j++;
                    }else{
                        j=1;
                    } 
                    
                }else if(id==2){
                    ans[j++]=ss[i];
                }
            }

            state=stateNew;
        }
        if(state==3){
            if(j>4){
                j=j-4;
                while(j>1 && ans[j] != '/'){
                    j--;
                }
            }else{
                j=1;
            }
            
        }else if(state==1){
            j=j-1;
        }
        if(j>1 && ans[j-1]=='/') j--;
        for(int k=0;k<j;k++){
            res+=ans[k];
        }
        return res;
    }
}

在这里插入图片描述

  • 思路二:题解里给的都是栈的方法,害,我也不会。下次遇到相似的题我再用用栈的方法吧。。。。
public String simplifyPath(String path) {
        String[] s = path.split("/");
        Stack<String> stack = new Stack<>();
        
        for (int i = 0; i < s.length; i++) {
            if (!stack.isEmpty() && s[i].equals(".."))
                stack.pop();
            else if (!s[i].equals("") && !s[i].equals(".") && !s[i].equals(".."))
                stack.push(s[i]);
        }
        if (stack.isEmpty())
            return "/";

        StringBuffer res = new StringBuffer();
        for (int i = 0; i < stack.size(); i++) {
            res.append("/" + stack.get(i));
        }
        return res.toString();
    }

作者:StackOverflow-
链接:https://leetcode-cn.com/problems/simplify-path/solution/java-yi-dong-yi-jie-xiao-lu-gao-by-spirit-9-18/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

发布了79 篇原创文章 · 获赞 7 · 访问量 1368

猜你喜欢

转载自blog.csdn.net/new_whiter/article/details/104433508