注意,在这个题里面,...
也视为一个目录…,还有可能出现多个/
,如
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Simplify Path
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
'''
#解决方法栈,题不难,情况很多...
class Solution(object):
def simplifyPath(self, path):
"""
:type path: str
:rtype: str
"""
ret = []
index = 0
length = len(path)
while index < length:
if path[index] == '.':
if (index + 1) < length:
if path[index + 1] == '/':
index += 2
elif path[index + 1] == '.':
if index + 2 < length:
if path[index + 2] == '/':
times = 0
while ret and times < 2:
if ret.pop() == '/':
times += 1
ret.append('/')
index += 3
else:
ret.append(path[index])
ret.append(path[index + 1])
ret.append(path[index + 2])
index += 3
else:
times = 0
while ret and times < 2:
if ret.pop() == '/':
times += 1
ret.append('/')
index += 3
else:
ret.append(path[index])
ret.append(path[index + 1])
index += 2
else:
break
else:
if not (ret and ret[-1] == '/' and path[index] == '/'):
ret.append(path[index])
index += 1
while ret and ret[-1] == '/':
ret.pop()
if not ret:
return '/'
return ''.join(ret)
if __name__ == "__main__":
s = Solution()
print s.simplifyPath("///eHx/..")
print s.simplifyPath("/...")
print s.simplifyPath("/.../")
print s.simplifyPath("/.")
print s.simplifyPath("/../")
print s.simplifyPath("/home//foo/")
print s.simplifyPath("/home/foo/.ssh/../.ssh2/authorized_keys")
print s.simplifyPath("/home//foo/")
print s.simplifyPath("/..hidden")
print s.simplifyPath("/home/..")
print s.simplifyPath("/home/./././")
print s.simplifyPath("/home/")
print s.simplifyPath("/a/./b/../../c/")
还可以在字符串后面添加一个’/’保证字符串以’/’结尾,这样就会简化很多.