Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::cmp::min;
- use std::ops::Range;
- fn completer(bracket: char) -> char {
- match bracket {
- ')' => '(',
- '}' => '{',
- ']' => '[',
- _ => unreachable!(),
- }
- }
- pub struct Char {
- index: usize,
- value: char,
- }
- fn main() {
- let input: String = std::env::args().nth(1).unwrap();
- let mut longest = Range::default();
- {
- let mut current = Range::default();
- let mut stack: Vec<Char> = Vec::with_capacity(input.len() << 1);
- let mut streak = false;
- for (i, c) in input.chars().enumerate() {
- match c {
- ']' | '}' | ')' => {
- let matched = stack
- .last()
- .map(|other| completer(c) == other.value)
- .unwrap_or_default();
- if matched {
- current.start = if streak {
- min(current.start, stack.pop().unwrap().index)
- } else {
- stack.pop().unwrap().index
- };
- current.end = i;
- streak = true;
- } else {
- stack.clear();
- if longest.len() < current.len() {
- longest = current;
- }
- current = Range {
- start: i + 1,
- end: i + 1,
- };
- streak = false;
- }
- }
- '[' | '{' | '(' => {
- stack.push(Char { index: i, value: c });
- }
- _ => {}
- };
- }
- if streak {
- longest = current;
- }
- }
- if longest.start != longest.end {
- longest.end += 1;
- }
- println!("{}", &input[longest]);
- }
Advertisement
Add Comment
Please, Sign In to add comment