/* * @lc app=leetcode id=1111 lang=rust * * [1111] Maximum Nesting Depth of Two Valid Parentheses Strings * * https://leetcode.com/problems/maximum-nesting-depth-of-two-valid-parentheses-strings/description/ * * algorithms * Medium (68.97%) * Total Accepted: 6.6K * Total Submissions: 9.5K * Testcase Example: '"(()())"' * * A string is a valid parentheses string (denoted VPS) if and only if it * consists of "(" and ")" characters only, and: * * * It is the empty string, or * It can be written as AB (A concatenated with B), where A and B are VPS's, * or * It can be written as (A), where A is a VPS. * * * We can similarly define the nesting depth depth(S) of any VPS S as * follows: * * * depth("") = 0 * depth(A + B) = max(depth(A), depth(B)), where A and B are VPS's * depth("(" + A + ")") = 1 + depth(A), where A is a VPS. * * * For example,  "", "()()", and "()(()())" are VPS's (with nesting depths 0, * 1, and 2), and ")(" and "(()" are not VPS's. * * * * Given a VPS seq, split it into two disjoint subsequences A and B, such that * A and B are VPS's (and A.length + B.length = seq.length). * * Now choose any such A and B such that max(depth(A), depth(B)) is the minimum * possible value. * * Return an answer array (of length seq.length) that encodes such a choice of * A and B:  answer[i] = 0 if seq[i] is part of A, else answer[i] = 1.  Note * that even though multiple answers may exist, you may return any of them. * * * Example 1: * * * Input: seq = "(()())" * Output: [0,1,1,1,1,0] * * * Example 2: * * * Input: seq = "()(())()" * Output: [0,0,0,1,1,0,1,1] * * * * Constraints: * * * 1 <= seq.size <= 10000 * * */ impl Solution { pub fn max_depth_after_split(seq: String) -> Vec { let mut res = vec![0]; let cs:Vec = seq.chars().collect(); for i in 1..seq.len() { res.push(if cs[i] == '(' { i as i32 & 1 } else { 1 - (i as i32 & 1)}); } res } } // pub structSolution; use std::collections::HashMap; use std::collections::HashSet; use std::fmt::Debug; use std::hash::Hash; use std::iter::FromIterator; use std::collections::VecDeque; #[allow(dead_code)] pub fn print_map(map: &HashMap) { for (k, v) in map.iter() { println!("{:?}: {:?}", k, v); } } #[allow(dead_code)] pub fn say_vec(nums: Vec){ println!("{:?}", nums); } #[allow(dead_code)] pub fn char_frequency(s: String) -> HashMap { let mut res:HashMap = HashMap::new(); for c in s.chars(){ *res.entry(c).or_insert(0) += 1; } res } #[allow(dead_code)] pub fn vec_counter(arr: Vec) -> HashMap { let mut c = HashMap::new(); for n in arr { *c.entry(n).or_insert(0) += 1; } c } #[allow(dead_code)] pub fn vec_to_hashset(arr: Vec) -> HashSet { HashSet::from_iter(arr.iter().cloned()) }