LeetCode71. 简化路径 (simplifyPath)

版权声明:转载请说明出处!!! https://blog.csdn.net/u012585868/article/details/83869203

题目描述

给定一个文档 (Unix-style) 的完全路径,请进行路径简化。

示例:

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

边界情况:

你是否考虑了 路径 = "/../" 的情况?
在这种情况下,你需返回 "/" 。
此外,路径中也可能包含多个斜杠 '/' ,如 "/home//foo/" 。
在这种情况下,你可忽略多余的斜杠,返回 "/home/foo" 。

解题思路

这道题让简化给定的路径,光是根据题目中给的那一个例子还真不太好总结出规律,应该再加上两个例子 path = “/a/./b/…/c/”, => “/a/c"和path = “/a/./b/c/”, => “/a/b/c”, 这样我们就可以知道中间是”.“的情况直接去掉,是”…“时删掉它上面挨着的一个路径,而下面的边界条件给的一些情况中可以得知,如果是空的话返回”/",如果有多个"/“只保留一个。那么我们可以把路径看做是由一个或多个”/"分割开的众多子字符串,把它们分别提取出来一一处理即可。

代码

class Solution {
public:
    string simplifyPath(string path) {
        vector <string> v;
        int i=0;//遍历指针
        while(i<path.size()){
            while(path[i]=='/'&&i<path.size()) i++;
            if(i==path.size()) break;
            int start=i;
            while(path[i]!='/'&&i<path.size()) i++;
            int end=i-1;
            string s=path.substr(start,end-start+1);
            if (s=="..") {
                if (!v.empty()) v.pop_back();
            } else if (s!=".") {
                v.push_back(s);
            }
        }
        if(v.empty()) return "/";
        string res;
        for(int i=0;i<v.size();i++){
            res+="/"+v[i];
        }
        return res;
    } 
};

注:
substr有2种用法:
假设: string s = “0123456789”;
string sub1 = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = “56789”
string sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:sub2 = “567”

猜你喜欢

转载自blog.csdn.net/u012585868/article/details/83869203