C++LeetCode 구현(71.경로 간소화)

[LeetCode]71.Simplify 경로 간소화
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
click to show corner cases.
Corner Cases:
  • Did you consider the case where path = "/../"?
    In this case, you should return "/".
  • Another corner case is the path might contain multiple slashes '/' together, such as "/home//foo/".
    In this case, you should ignore redundant slashes and return "/home/foo".
  • 이 문 제 는 주어진 경 로 를 간소화 시 키 고 문제 에서 준 그 예 만 으로 는 규칙 을 정리 하기 가 쉽 지 않 으 니 두 가지 예 를 더 해 야 한다. path = "/a/./b/../c/", => "/a/c"와 path = "/a/./b/c/", => "/a/b/c",이렇게 하면 우 리 는 중간 이"."인 상황 을 직접 제거 할 수 있 습 니 다."............................................................그러면 우 리 는 경 로 를 하나 이상 의'/'로 나 누 어 진 여러 하위 문자열 로 볼 수 있 습 니 다.이 를 각각 추출 하여 일일이 처리 하면 됩 니 다.코드 는 다음 과 같 습 니 다.
    C++해법 1:
    
    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;
        }
    };
    또 하나의 해법 은 C 언어의 함수 strtok 를 이용 하여 문자열 을 구분 하 는 것 입 니 다.그러나 string 과 char*유형 을 서로 바 꿔 야 합 니 다.변환 방법 은 맹렬하게 찔러 주 십시오여기,이곳이것 을 제외 하고 나머지 사상 은 위의 해법 과 같 습 니 다.코드 는 다음 과 같 습 니 다.
    C 해법 1:
    
    class Solution {
    public:
        string simplifyPath(string path) {
            vector<string> v;
            char *cstr = new char[path.length() + 1];
            strcpy(cstr, path.c_str());
            char *pch = strtok(cstr, "/");
            while (pch != NULL) {
                string p = string(pch);
                if (p == "..") {
                    if (!v.empty()) v.pop_back();
                } else if (p != ".") {
                    v.push_back(p);
                }
                pch = strtok(NULL, "/");
            }
            if (v.empty()) return "/";
            string res;
            for (int i = 0; i < v.size(); ++i) {
                res += '/' + v[i];
            }
            return res;
        }
    };
    C++에 도 문자열 을 전문 적 으로 처리 하 는 메커니즘 이 있 습 니 다.우 리 는 stringstream 을 사용 하여 문자열 을 구분 한 다음 에 모든 단락 을 각각 처리 할 수 있 습 니 다.사고방식 은 위의 방법 과 비슷 합 니 다.코드 는 다음 과 같 습 니 다.
    C++해법 2:
    
    class Solution {
    public:
        string simplifyPath(string path) {
            string res, t;
            stringstream ss(path);
            vector<string> v;
            while (getline(ss, t, '/')) {
                if (t == "" || t == ".") continue;
                if (t == ".." && !v.empty()) v.pop_back();
                else if (t != "..") v.push_back(t);
            }
            for (string s : v) res += "/" + s;
            return res.empty() ? "/" : res;
        }
    };
    자바 해법 2:
    
    public class Solution {
        public String simplifyPath(String path) {
            Stack<String> s = new Stack<>();
            String[] p = path.split("/");
            for (String t : p) {
                if (!s.isEmpty() && t.equals("..")) {
                    s.pop();
                } else if (!t.equals(".") && !t.equals("") && !t.equals("..")) {
                    s.push(t);
                }
            }
            List<String> list = new ArrayList(s);
            return "/" + String.join("/", list);
        }
    }
    C++구현 LeetCode(71.경로 간소화)에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C++구현 경로 간소화 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기