Guest User

Longest matching brackets sequence searcher

a guest
Aug 22nd, 2023
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.96 KB | Source Code | 0 0
  1. use std::cmp::min;
  2. use std::ops::Range;
  3.  
  4. fn completer(bracket: char) -> char {
  5.     match bracket {
  6.         ')' => '(',
  7.         '}' => '{',
  8.         ']' => '[',
  9.         _ => unreachable!(),
  10.     }
  11. }
  12.  
  13. pub struct Char {
  14.     index: usize,
  15.     value: char,
  16. }
  17.  
  18. fn main() {
  19.     let input: String = std::env::args().nth(1).unwrap();
  20.     let mut longest = Range::default();
  21.     {
  22.         let mut current = Range::default();
  23.         let mut stack: Vec<Char> = Vec::with_capacity(input.len() << 1);
  24.         let mut streak = false;
  25.         for (i, c) in input.chars().enumerate() {
  26.             match c {
  27.                 ']' | '}' | ')' => {
  28.                     let matched = stack
  29.                         .last()
  30.                         .map(|other| completer(c) == other.value)
  31.                         .unwrap_or_default();
  32.                     if matched {
  33.                         current.start = if streak {
  34.                             min(current.start, stack.pop().unwrap().index)
  35.                         } else {
  36.                             stack.pop().unwrap().index
  37.                         };
  38.                         current.end = i;
  39.                         streak = true;
  40.                     } else {
  41.                         stack.clear();
  42.                         if longest.len() < current.len() {
  43.                             longest = current;
  44.                         }
  45.                         current = Range {
  46.                             start: i + 1,
  47.                             end: i + 1,
  48.                         };
  49.                         streak = false;
  50.                     }
  51.                 }
  52.                 '[' | '{' | '(' => {
  53.                     stack.push(Char { index: i, value: c });
  54.                 }
  55.                 _ => {}
  56.             };
  57.         }
  58.  
  59.         if streak {
  60.             longest = current;
  61.         }
  62.     }
  63.  
  64.     if longest.start != longest.end {
  65.         longest.end += 1;
  66.     }
  67.     println!("{}", &input[longest]);
  68. }
  69.  
Advertisement
Add Comment
Please, Sign In to add comment