1. 程式人生 > >LeetCode71. 簡化路徑 (simplifyPath)

LeetCode71. 簡化路徑 (simplifyPath)

題目描述

給定一個文件 (Unix-style) 的完全路徑,請進行路徑簡化。

示例:

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

邊界情況:

你是否考慮了 路徑 = "/../" 的情況?
在這種情況下,你需返回 "/" 。
此外,路徑中也可能包含多個斜槓 '/' ,如 "/home//foo/" 。
在這種情況下,你可忽略多餘的斜槓,返回 "/home/foo" 。

解題思路

這道題讓簡化給定的路徑,光是根據題目中給的那一個例子還真不太好總結出規律,應該再加上兩個例子 path = “/a/./b/…/c/”, => “/a/c"和path = “/a/./b/c/”, => “/a/b/c”, 這樣我們就可以知道中間是”.“的情況直接去掉,是”…“時刪掉它上面挨著的一個路徑,而下面的邊界條件給的一些情況中可以得知,如果是空的話返回”/",如果有多個"/“只保留一個。那麼我們可以把路徑看做是由一個或多個”/"分割開的眾多子字串,把它們分別提取出來一一處理即可。

程式碼

class Solution {
public:
    string simplifyPath(string path) {
        vector <string> v;
        int i=0;//遍歷指標
        while(i<path.size()){
            while(path[i]=='/'&&i<path.size()) i++;
            if(i==path.size()) break;
            int start=i;
            while
(path[i]!='/'&&i<path.size()) i++; int end=i-1; string s=path.substr(start,end-start+1); if (s=="..") { if (!v.empty()) v.pop_back(); } else if (s!=".") { v.push_back(s); } } if(v.empty
()) return "/"; string res; for(int i=0;i<v.size();i++){ res+="/"+v[i]; } return res; } };

注:
substr有2種用法:
假設: string s = “0123456789”;
string sub1 = s.substr(5); //只有一個數字5表示從下標為5開始一直到結尾:sub1 = “56789”
string sub2 = s.substr(5, 3); //從下標為5開始擷取長度為3位:sub2 = “567”