leetcode简单题5 N.20 有效的括号 rust描述

// "()"  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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值