思路:
- 匹配表:定义一个函数,返回每个右括号对应的左括号。(哈希表匹配也行)
- 栈操作:遍历字符串中的字符,左括号入栈,右括号则与栈顶元素匹配。
- 最终检查:遍历结束后,若栈为空,则所有括号匹配,否则不匹配。
图解:

语法注意:
into_iter().collect() 和 chars().collect() 都可以将一个字符串转换为字符向量(Vec<char>),但它们的区别在于:
-
into_iter().collect():into_iter()是一个所有权获取方法,意味着它会消耗原始集合(在这里是字符串),而不会创建集合的引用。- 使用
into_iter()后,原始字符串将不再可用。 - 适用于希望消耗集合并将其转换为其他集合的情况。
String类型不能直接调用into_iter()方法。要正确使用,需要将字符串转为字符向量:
-
chars().collect():chars()方法返回一个迭代器,该迭代器按字符(char)切分字符串。chars()不会消耗原始字符串,原始字符串仍然可用。- 适用于希望按字符处理字符串的情况。
代码:
impl Solution {fn pairs(c : char) -> char{match c{'}' => '{',')' => '(',']' => '[',_ => 'f'}}pub fn is_valid(s: String) -> bool {let n = s.len();if n % 2 != 0{return false;}let mut chars :Vec<char> = s.chars().collect();let mut stack = Vec::new();let mut left = 0;for c in chars{let ch = Solution::pairs(c);if ch != 'f'{if stack.is_empty() || stack.pop().unwrap() != ch{return false;}}else{stack.push(c);}}stack.is_empty()}
}
