Leetcode算法——71、簡化路徑(simplify path)

給定一個文件的絕對路徑(unix系統),將其簡化。

在unix文件系統中,’.’ 表示當前目錄,因此可以被忽略。’…’ 表示上一個目錄,因此需要取消掉最後一層目錄。

示例:

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

邊界示例:

  • “/…/” 應該返回 “/”
  • 多個斜線應該合爲一個,如 “/home//foo/” 應該返回 “/home/foo”

思路

先將斜線之間的目錄按順序提取出來,並定義一個空的結果路徑,然後從左到右進行遍歷。

  • 如果遇到 ‘.’,則跳過,繼續遍歷。
  • 如果遇到 ‘…’,則結果路徑中的最後一個路徑刪掉,繼續遍歷。
  • 否則,將此路徑添加到結果路徑中,繼續遍歷。

最後,需要注意兩個邊界示例,因此在按斜線分隔之前,先將多個斜線合爲一個(用正則式匹配和替換);在遍歷結束之後,若爲空路徑,則改爲’/’;若最後一個字符爲斜線,則去掉。

python實現

import re
def simplifyPath(path):
    """
    :type path: str
    :rtype: str
    先將斜線之間的目錄按順序提取出來,然後從左到右進行 . 和 .. 的分析。
    """
    # 將多個斜線換成1個
    pattern = re.compile(r'/{2,}')
    path = re.sub(pattern, '/', path)
    
    # 分割
    splits = path.split('/')
    results = []
    for split in splits:
        if (split == '..' and len(results) == 1) or (split == '.'):
            continue
        if split == '..':
            results = results[:-1]
        else:
            results.append(split)
    result = '/'.join(results)
    if result == '': # 爲空時返回一個斜槓
        result = '/'
    elif len(result) > 1 and result[-1] == '/': # 去掉最後一個斜槓
        result = result[:-1]
    return result

if '__main__' == __name__:
    path = "/"
    print(simplifyPath(path))
                
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章