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