// "()" true
// "()[]{}" true
// "(]" false
//直接遍历
pub fn is_valid(s: String) -> bool {
let mut s = s;
while s.contains("()") || s.contains("[]") || s.contains("{}") {//contains()字符串中包含内容
s = s.replace("()", "").replace("[]", "").replace("{}", "");//替换后是否为空
}
s.is_empty()//空 true
}
//栈
pub fn is_valid2(s: String) -> bool {
let mut stack = Vec::new();//用于存放字符的栈
for c in s.chars() {//遍历所有字符
match c {
'(' => stack.push(')'),//匹配左符号 存入右符号
'{' => stack.push('}'),
'[' => stack.push(']'),
')' | '}' | ']' if Some(c) != stack.pop() => return false,//pop返回option枚举 if 守卫表达式 遍历的与存入的进行匹配
_ => (),
}
}
stack.is_empty()
}
//处理完整字符串括号匹配
pub fn is_valid3(s: String) -> bool {
fn check(s: &[char], left: usize, right: usize) -> bool {
if left > right {//因为 右索引-1 长度为0的时候 满足条件
return true;
}
if (right - left + 1) % 2 != 0 {//过滤后的字符串不是偶数 直接返回false
return false;
}
let mut stack = Vec::new();
for i in left..=right { //因为右索引 所以等号
match s[i] {//栈匹配逻辑 跟之前的比 这是存储上省了,匹配上复杂 个人更推荐前面的栈逻辑
'(' | '{' | '[' => stack.push(s[i]),
')' => {
if stack.pop() != Some('(') {
return false;
}
}
'}' => {
if stack.pop() != Some('{') {
return false;
}
}
']' => {
if stack.pop() != Some('[') {
return false;
}
}
_ => (),
}
}
stack.is_empty()
}
let filtered_s: Vec<char> = s.chars().collect();
//下行可以过滤掉无关内容,虽然本题不会给除了有效内容外的内容
//let filtered_s: Vec<char> = s.chars().filter(|&c| "[](){}".contains(c)).collect();//filter 是一个迭代器适配器,它接受一个闭包(或函数)作为参数,并返回一个新的迭代器,该迭代器只产生满足闭包条件的元素。
check(&filtered_s, 0, filtered_s.len() - 1)// 左索引 右索引
//check是过滤后的,本质上不适用本题,
//&[char] 能够直接接收以下几种类型的引用 字符数组(fixed-size array of char)的引用 字符向量(Vec<char>)的引用 另一个字符切片的引用(切片引用切片是合法的,因为它们都是对相同类型连续内存区域的引用)
}
fn main() {
assert_eq!(is_valid("()".to_string()), true);
assert_eq!(is_valid("()[]{}".to_string()), true);
assert_eq!(is_valid("(]".to_string()), false);
assert_eq!(is_valid2("()".to_string()), true);
assert_eq!(is_valid2("()[]{}".to_string()), true);
assert_eq!(is_valid2("(]".to_string()), false);
assert_eq!(is_valid3("()".to_string()), true);
assert_eq!(is_valid3("()[]{}".to_string()), true);
assert_eq!(is_valid3("(]".to_string()), false);
}
leetcode简单题5 N.20 有效的括号 rust描述
于 2024-06-28 14:03:09 首次发布