Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- fn main() {
- let length = std::env::args()
- .skip(1)
- .next()
- .unwrap()
- .parse::<u8>()
- .expect("");
- let mut list: Vec<String> = Vec::new();
- fill_list("".to_string(), length / 2, length, &mut list);
- for s in list {
- if check(s.clone()) {
- println!("{}", s);
- }
- }
- }
- fn fill_list(prefix: String, n_openings: u8, length: u8, v: &mut Vec<String>) {
- let openings = "({[";
- let closings = ")}]";
- let all = "(){}[]";
- if length == 0 {
- v.push(prefix.clone());
- return;
- }
- if prefix.is_empty() {
- for c in openings.chars() {
- let mut q = prefix.clone();
- q.push(c);
- fill_list(q, n_openings - 1, length - 1, v);
- }
- } else if length == 1 {
- for c in closings.chars() {
- let mut q = prefix.clone();
- q.push(c);
- fill_list(q, n_openings, length - 1, v);
- }
- } else if n_openings == 0 {
- for c in closings.chars() {
- let mut q = prefix.clone();
- q.push(c);
- fill_list(q, n_openings, length - 1, v);
- }
- } else {
- for c in all.chars() {
- let mut q = prefix.clone();
- q.push(c);
- match c {
- '(' => fill_list(q, n_openings - 1, length - 1, v),
- '{' => fill_list(q, n_openings - 1, length - 1, v),
- '[' => fill_list(q, n_openings - 1, length - 1, v),
- _ => fill_list(q, n_openings, length - 1, v),
- }
- }
- }
- }
- fn check(s: String) -> bool {
- let mut stack = Vec::new();
- for bracket in s.chars() {
- match bracket {
- '{' => stack.push(bracket),
- '[' => stack.push(bracket),
- '(' => stack.push(bracket),
- '}' => {
- if stack.last() == Some(&'{') {
- stack.pop();
- } else {
- stack.push(bracket);
- }
- }
- ']' => {
- if stack.last() == Some(&'[') {
- stack.pop();
- } else {
- stack.push(bracket);
- }
- }
- ')' => {
- if stack.last() == Some(&'(') {
- stack.pop();
- } else {
- stack.push(bracket);
- }
- }
- _ => unreachable!(),
- }
- }
- return stack.is_empty();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement