|
@@ -0,0 +1,112 @@
|
|
|
+struct Solution;
|
|
|
+
|
|
|
+
|
|
|
+impl Solution {
|
|
|
+ pub fn simplify_path(path: String) -> String {
|
|
|
+
|
|
|
+ let mut v: Vec<char> = path.char_indices().map(|(_, c)| c).collect();
|
|
|
+
|
|
|
+ let l = v.len();
|
|
|
+ if v[l-1] != '/' {
|
|
|
+ v.push('/');
|
|
|
+ }
|
|
|
+ let l = v.len();
|
|
|
+ let mut i = 0;
|
|
|
+ let mut stack = vec![];
|
|
|
+ let mut top = 0;
|
|
|
+ let mut flag = 0;
|
|
|
+ while i < l {
|
|
|
+ if i == 0 {
|
|
|
+ stack.push(v[i]);
|
|
|
+ top = i;
|
|
|
+
|
|
|
+ } else if v[i] == '.' && stack[top] == '/' {
|
|
|
+ flag += 1;
|
|
|
+ stack.push(v[i]);
|
|
|
+ } else if flag == 1 && v[i] == '/' {
|
|
|
+ stack.pop();
|
|
|
+ top = stack.len() - 1;
|
|
|
+ flag = 0;
|
|
|
+ } else if flag == 2 && v[i] == '/' {
|
|
|
+ stack.pop();
|
|
|
+ stack.pop();
|
|
|
+ while top > 0 {
|
|
|
+ stack.pop();
|
|
|
+ top -=1;
|
|
|
+ if stack[top] == '/' {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ flag = 0;
|
|
|
+ } else if flag == 0 && v[i] == '/' && stack[top] == '/' {
|
|
|
+
|
|
|
+ } else {
|
|
|
+ stack.push(v[i]);
|
|
|
+ top = stack.len() - 1;
|
|
|
+ flag = 0;
|
|
|
+ }
|
|
|
+ i += 1;
|
|
|
+
|
|
|
+ // println!("stack : {:?}, flag: {}, top: {}", stack, flag, top);
|
|
|
+ }
|
|
|
+ if stack.len() > 1 && stack[stack.len() - 1] == '/' {
|
|
|
+ stack.pop();
|
|
|
+ }
|
|
|
+
|
|
|
+ let res = stack.into_iter().collect::<String>();
|
|
|
+ res
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#[cfg(test)]
|
|
|
+mod tests {
|
|
|
+ use super::*;
|
|
|
+
|
|
|
+ #[test]
|
|
|
+ fn test_simplify_path1() {
|
|
|
+ let s = String::from("/Home/Users/");
|
|
|
+ let res = Solution::simplify_path(s);
|
|
|
+ assert_eq!("/Home/Users", res);
|
|
|
+ }
|
|
|
+
|
|
|
+ #[test]
|
|
|
+ fn test_simplify_path2() {
|
|
|
+ let s = String::from("/Home//.././Users/");
|
|
|
+ let res = Solution::simplify_path(s);
|
|
|
+ assert_eq!("/Users", res);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ #[test]
|
|
|
+ fn test_simplify_path3() {
|
|
|
+ let s = String::from("/../");
|
|
|
+ let res = Solution::simplify_path(s);
|
|
|
+ assert_eq!("/", res);
|
|
|
+ }
|
|
|
+ #[test]
|
|
|
+ fn test_simplify_path4() {
|
|
|
+ let s = String::from("/Home//./Users/");
|
|
|
+ let res = Solution::simplify_path(s);
|
|
|
+ assert_eq!("/Home/Users", res);
|
|
|
+ }
|
|
|
+
|
|
|
+ #[test]
|
|
|
+ fn test_simplify_path5() {
|
|
|
+ let s = String::from("/Home//.../Users/");
|
|
|
+ let res = Solution::simplify_path(s);
|
|
|
+ assert_eq!("/Home/.../Users", res);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ #[test]
|
|
|
+ fn test_simplify_path6() {
|
|
|
+ let s = String::from("/a//b////c/d//././/..");
|
|
|
+ let res = Solution::simplify_path(s);
|
|
|
+ assert_eq!("/a/b/c", res);
|
|
|
+ }
|
|
|
+}
|