1. 程式人生 > >【LeetCode 中等題】36-簡化路徑

【LeetCode 中等題】36-簡化路徑

題目描述:給定一個文件 (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)