Leetcode 3. Longest Substring Without Repeating Characters
              
  
    
  
  smpl published on
  
    
  
  
            
            
              
  
    
  
  1 min,
  
    
  
  17 words
            
            문제 : 3. Longest Substring Without Repeating Characters
등급 : Medium
#![allow(dead_code)]
pub(self) mod structural_try {
    // 처음 짜본 버전..
    use std::collections::VecDeque;
    use std::cmp::PartialEq;
    pub struct Solution;
    impl Solution {
        fn find<T: std::cmp::PartialEq + Copy>(vd: &VecDeque<T>, fv: &T) -> Option<usize> {
            for (i, v) in vd.iter().enumerate() {
                if v == fv {
                    return Some(i)
                }
            }
            None
        }
        pub fn length_of_longest_substring(s: String) -> i32 {
            let mut subchars = VecDeque::new();
            let mut longest = 0i32;
            for c in s.chars() {
                if let Some(pos) = Self::find::<char>(&subchars, &c) {
                    subchars.drain(0..pos+1);
                }
                subchars.push_back(c);
                if longest < subchars.len() as i32 {
                    longest = subchars.len() as i32;
                }
            }
            return longest;
        }
    }
}
#[allow(dead_code)]
pub(self) mod functional_try {
    // 조금이라도 더 함수형으로 짜려고 시도한 버전
    use std::collections::VecDeque;
    use std::cmp::max;
    pub struct Solution;
    impl Solution {
        pub fn length_of_longest_substring(s: String) -> i32 {
            s.chars().fold((VecDeque::new(), 0), |(mut subchars, mut longest), c| {
                if let Some(i) = subchars.iter().position(|v| v == &c) {
                    subchars.drain(0..i+1);
                }
                subchars.push_back(c);
                longest = max(longest, subchars.len());
                (subchars, longest)
            }).1 as i32
        }
    }
}
#[cfg(test)]
mod tests {
    use crate::longest_substring_without_repeating_characters::functional_try::Solution;
    #[test]
    fn length_of_longest_substring() {
        assert_eq!(Solution::length_of_longest_substring("abcabcbb".to_owned()), 3);
        assert_eq!(Solution::length_of_longest_substring("bbbbb".to_owned()), 1);
        assert_eq!(Solution::length_of_longest_substring("pwwkew".to_owned()), 3);
        assert_eq!(Solution::length_of_longest_substring("".to_owned()), 0);
    }
}