diff --git a/problems/simplify-path.rs b/problems/simplify-path.rs new file mode 100644 index 0000000..f0c8fe1 --- /dev/null +++ b/problems/simplify-path.rs @@ -0,0 +1,49 @@ +struct Solution {} +impl Solution { + pub fn simplify_path(path: String) -> String { + let mut simplified_path = Vec::<&str>::new(); + + path.split('/').for_each(|seg| { + if seg.is_empty() || seg == "." { + return; + } + + if seg == ".." { + simplified_path.pop(); + return; + } + + simplified_path.push(seg); + }); + + "/".to_owned() + &simplified_path.join("/") + } +} + +fn main() {} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn one_directory() { + assert_eq!( + Solution::simplify_path("/home/".to_owned()), + "/home".to_owned() + ); + } + + #[test] + fn just_root() { + assert_eq!(Solution::simplify_path("/../".to_owned()), "/".to_owned()); + } + + #[test] + fn consecutive_slashes() { + assert_eq!( + Solution::simplify_path("/home//foo/".to_owned()), + "/home/foo".to_owned() + ); + } +}