Description
Given an absolute path for a file (Unix-style), simplify it. Or in other words, convert it to the canonical path.
In a UNIX-style file system, a period . refers to the current directory. Furthermore, a double period … moves the directory up a level. For more information, see: Absolute path vs relative path in Linux/Unix
Note that the returned canonical path must always begin with a slash /, and there must be only a single slash / between two directory names. The last directory name (if it exists) must not end with a trailing /. Also, the canonical path must be the shortest string representing the absolute path.
Example 1:
Input:
"/home/"
Output:
"/home"
Explanation:
Note that there is no trailing slash after the last directory name.
Example 2:
Input:
"/../"
Output:
"/"
Explanation:
Going one level up from the root directory is a no-op, as the root level is the highest level you can go.
Example 3:
Input:
"/home//foo/"
Output:
"/home/foo"
Explanation:
In the canonical path, multiple consecutive slashes are replaced by a single one.
Example 4:
Input:
"/a/./b/../../c/"
Output:
"/c"
Example 5:
Input:
"/a/../../b/../c//.//"
Output:
"/c"
Example 6:
Input:
"/a//bc/d//././/.."
Output:
"/a/b/c"
分析
题目的意思是:给你一个路径,返回其路径的最简短的形式。
- 这个就根据题目的规则解析一下就行了。中间是".“的情况直接去掉,是”…“时删掉它上面挨着的一个路径,而下面的边界条件给的一些情况中可以得知,如果是空的话返回”/“,如果有多个”/“只保留一个。那么可以把路径看做是由一个或多个”/"分割开的众多子字符串,把它们分别提取出来一一处理即可
C++实现
class Solution {
public:
string simplifyPath(string path) {
vector<string> v;
int i=0;
int n=path.length();
while(i<n){
while(i<n&&path[i]=='/'){
i++;
}
if(i==n) break;
int left=i;
while(i<n&&path[i]!='/'){
i++;
}
int right=i-1;
string s=path.substr(left,right-left+1);
if(s==".."){
if(!v.empty()){
v.pop_back();
}
}else if(s!="."){
v.push_back(s);
}
}
string res="";
for(auto s:v){
res=res+"/"+s;
}
return v.empty() ? "/":res;
}
};
Python实现
这里python有一个split函数,可以对字符串进行切分,所以实现起来就很简洁。
class Solution:
def simplifyPath(self, path: str) -> str:
names = path.split('/')
st = []
for name in names:
if name == '..':
if st:
st.pop()
elif name and name != '.':
st.append(name)
return '/'+'/'.join(st)