【LeetCode 中等題】36-簡化路徑
阿新 • • 發佈:2019-01-07
題目描述:給定一個文件 (Unix-style) 的完全路徑,請進行路徑簡化。
例如,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
邊界情況:
- 你是否考慮了 路徑 =
"/../"
的情況?
在這種情況下,你需返回"/"
。 - 此外,路徑中也可能包含多個斜槓
'/'
,如"/home//foo/"
。
在這種情況下,你可忽略多餘的斜槓,返回"/home/foo"
。
解法1。輸入是一個個基本字元組成的字串,遍歷是基本,關鍵是如何制定遍歷規則。遇到/就繼續,知道遇到字元,記錄下正常字元的起止index,判斷是否為..或.,如果是..就要pop出棧頂,如果是.就不管,反之壓棧。
class Solution(object): def simplifyPath(self, path): """ :type path: str :rtype: str """ len_p = len(path) if not path or len_p == 0: return '/' valid_str = [] i = 0 while i < len_p: while i < len_p and path[i] == '/': i += 1 if i == len_p: break start = i while i < len_p and path[i] != '/': i += 1 end = i sub_str = path[start:end] if sub_str == '..': if valid_str: valid_str.pop() elif sub_str != '.': valid_str.append(sub_str) if not valid_str: return '/' res = '' for c in valid_str: res += '/'+c return res
解法2。一種更簡略的做法
class Solution(object): def simplifyPath(self, path): """ :type path: str :rtype: str """ len_p = len(path) if not path or len_p == 0: return '/' valid_str = [i for i in path.split('/') if i] stack = [] for i in valid_str: if i == '.': continue elif i == '..': if stack: stack.pop() else: stack.append(i) return '/'+ '/'.join(stack)