Advertisement
Guest User

Untitled

a guest
Aug 17th, 2023
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.56 KB | Source Code | 0 0
  1. fn main() {
  2.     let length = std::env::args()
  3.         .skip(1)
  4.         .next()
  5.         .unwrap()
  6.         .parse::<u8>()
  7.         .expect("");
  8.  
  9.     let mut list: Vec<String> = Vec::new();
  10.  
  11.     fill_list("".to_string(), length / 2, length, &mut list);
  12.  
  13.     for s in list {
  14.         if check(s.clone()) {
  15.             println!("{}", s);
  16.         }
  17.     }
  18. }
  19.  
  20. fn fill_list(prefix: String, n_openings: u8, length: u8, v: &mut Vec<String>) {
  21.     let openings = "({[";
  22.     let closings = ")}]";
  23.     let all = "(){}[]";
  24.  
  25.     if length == 0 {
  26.         v.push(prefix.clone());
  27.         return;
  28.     }
  29.  
  30.     if prefix.is_empty() {
  31.         for c in openings.chars() {
  32.             let mut q = prefix.clone();
  33.  
  34.             q.push(c);
  35.  
  36.             fill_list(q, n_openings - 1, length - 1, v);
  37.         }
  38.     } else if length == 1 {
  39.         for c in closings.chars() {
  40.             let mut q = prefix.clone();
  41.  
  42.             q.push(c);
  43.  
  44.             fill_list(q, n_openings, length - 1, v);
  45.         }
  46.     } else if n_openings == 0 {
  47.         for c in closings.chars() {
  48.             let mut q = prefix.clone();
  49.  
  50.             q.push(c);
  51.  
  52.             fill_list(q, n_openings, length - 1, v);
  53.         }
  54.     } else {
  55.         for c in all.chars() {
  56.             let mut q = prefix.clone();
  57.  
  58.             q.push(c);
  59.  
  60.             match c {
  61.                 '(' => fill_list(q, n_openings - 1, length - 1, v),
  62.                 '{' => fill_list(q, n_openings - 1, length - 1, v),
  63.                 '[' => fill_list(q, n_openings - 1, length - 1, v),
  64.                 _ => fill_list(q, n_openings, length - 1, v),
  65.             }
  66.         }
  67.     }
  68. }
  69.  
  70. fn check(s: String) -> bool {
  71.     let mut stack = Vec::new();
  72.  
  73.     for bracket in s.chars() {
  74.         match bracket {
  75.             '{' => stack.push(bracket),
  76.             '[' => stack.push(bracket),
  77.             '(' => stack.push(bracket),
  78.             '}' => {
  79.                 if stack.last() == Some(&'{') {
  80.                     stack.pop();
  81.                 } else {
  82.                     stack.push(bracket);
  83.                 }
  84.             }
  85.             ']' => {
  86.                 if stack.last() == Some(&'[') {
  87.                     stack.pop();
  88.                 } else {
  89.                     stack.push(bracket);
  90.                 }
  91.             }
  92.             ')' => {
  93.                 if stack.last() == Some(&'(') {
  94.                     stack.pop();
  95.                 } else {
  96.                     stack.push(bracket);
  97.                 }
  98.             }
  99.             _ => unreachable!(),
  100.         }
  101.     }
  102.  
  103.     return stack.is_empty();
  104. }
  105.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement