アルゴリズム leetcode|71. パスを簡略化する (サビが激しくパンチする)



71. パスを単純化します。

特定のファイルまたはディレクトリを指すpathUnix スタイルの絶対パス ( で始まる) を表す文字列が与えられています。これをより簡潔な正規パスに変換してください。'/'

Unix スタイルのファイルシステムでは、1 つのドット ( .) は現在のディレクトリ自体を示し、さらに 2 つのドット ( ..) はディレクトリを 1 レベル上に切り替えること (親ディレクトリを指す) を示します。両方とも複雑な相対パスの一部である可能性があります。任意の数の連続したスラッシュ (つまり'//') は 1 つのスラッシュとして扱われます'/'この質問では、他の形式のドット (たとえば、'...') はファイル/ディレクトリ名として扱われます。

返される正規パスは以下の形式に従う必要があることに注意してください。

  • 必ず'/'スラッシュで始めてください。
  • 2 つのディレクトリ名の間には、スラッシュが 1 つだけ必要です'/'
  • 最後のディレクトリ名 (存在する場合) はで終わることはできません'/'
  • また、 path には、ルート ディレクトリからターゲット ファイルまたはディレクトリまでのパス上のディレクトリのみが含まれます (つまり、'.'または は付きません'..')。

簡略化された正規パスを返します

例 1:

输入:
	
	path = "/home/"
	
输出:
	
	"/home"
	
解释:
	
	注意,最后一个目录名后面没有斜杠。 

例 2:

输入:
	
	path = "/../"
	
输出:
	
	"/"
	
解释:
	
	从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。

例 3:

输入:
	
	path = "/home//foo/"
	
输出:
	
	"/home/foo"
	
解释:
	
	在规范路径中,多个连续斜杠需要用一个斜杠替换。

例 4:

输入:
	
	path = "/a/./b/../../c/"
	
输出:
	
	"/c"

ヒント:

  • 1 <= path.length <= 3000
  • path英文字、数字、、、または で'.'構成'/'されます'_'
  • pathは、有効な Unix スタイルの絶対パスです。

分析します:

  • このアルゴリズムの問​​題に直面して、二代目リーダーは再び考え込んでしまいました。
  • 直接シミュレーションするだけです。重要なのは、適切なデータ構造を選択することです。解決は簡単です。
  • に従って完全なパスをグループに分割し'/'、スタックを使用して簡略化されたパス構造を保存し、状況に応じて分岐ロジックに従います。
    1. '.'または空格:の場合は'空格'意味はなく、'.'カレントディレクトリを意味し、処理を行わずにそのままスキップされます。
    2. :の場合は'..'、上位ディレクトリにジャンプすることを意味し、このときルートディレクトリに到達しない限り上にジャンプする必要があるため、スタックが空でない限りスタック操作が実行されます。 。
    3. その他の文字列: これらはすべて有効なディレクトリ名とみなされ、スタックにプッシュされます。
  • トラバーサルプロセスが完了すると、キューメソッドに従って簡略化されたパスが接続されます。

答え:

さび:

impl Solution {
    
    
    pub fn simplify_path(path: String) -> String {
    
    
        let mut stack = Vec::new();
        path.split('/').for_each(|name| match name {
    
    
            "." | "" => (),
            ".." => {
    
    
                stack.pop();
            }
            _ => stack.push(name),
        });
        "/".to_string() + &stack.join("/")
    }
}

行く:

func simplifyPath(path string) string {
    
    
    var stack []string
	for _, name := range strings.Split(path, "/") {
    
    
		if name == ".." {
    
    
			if len(stack) > 0 {
    
    
				stack = stack[:len(stack)-1]
			}
		} else if name != "" && name != "." {
    
    
			stack = append(stack, name)
		}
	}
	return "/" + strings.Join(stack, "/")
}

c++:

class Solution {
    
    
public:
    string simplifyPath(string path) {
    
    
        stringstream ss(path);
        vector<string> stack;
        string name = "";
        while (getline(ss, name, '/')) {
    
    
            if (name == "..") {
    
    
                if (!stack.empty()) {
    
    
                    stack.pop_back();
                }
            } else if (!name.empty() && name != ".") {
    
    
                stack.push_back(move(name));
            }
        }
        string ans;
        if (stack.empty()) {
    
    
            ans = "/";
        } else {
    
    
            for (string &name: stack) {
    
    
                ans += "/" + move(name);
            }
        }
        return ans;
    }
};

パイソン:

class Solution:
    def simplifyPath(self, path: str) -> str:
        names = path.split("/")
        stack = list()
        for name in names:
            if name == "..":
                if stack:
                    stack.pop()
            elif name and name != ".":
                stack.append(name)
        return "/" + "/".join(stack)


ジャワ:

class Solution {
    
    
    public String simplifyPath(String path) {
    
    
        String[]      names = path.split("/");
        Deque<String> stack = new ArrayDeque<String>();
        for (String name : names) {
    
    
            if ("..".equals(name)) {
    
    
                if (!stack.isEmpty()) {
    
    
                    stack.pollLast();
                }
            } else if (name.length() > 0 && !".".equals(name)) {
    
    
                stack.offerLast(name);
            }
        }
        StringBuilder ans = new StringBuilder();
        if (stack.isEmpty()) {
    
    
            ans.append('/');
        } else {
    
    
            while (!stack.isEmpty()) {
    
    
                ans.append('/');
                ans.append(stack.pollFirst());
            }
        }
        return ans.toString();
    }
}

この記事を読んでいただきありがとうございます~
【いいね】【お気に入り】【コメント】へようこそ~三回連続で歩きましょう~
諦めるのは難しいことではありませんが、やり抜くのはカッコいいですね~
みんなで改善できればと思います毎日少しずつ〜
この記事は二代目マスターのホワイトハットによって書かれています:https://le-yi.blog.csdn.net/ブログオリジナル〜


おすすめ

転載: blog.csdn.net/leyi520/article/details/132356719