一、题目
二、解答
思路:
①先将输入的字符串转ASCII码存入数组arr[]中,字符串长度如果是奇数直接排除,偶数才进入判断。
②遍历arr[]中的每个括号,如果是左括号,推进栈里,如果是右括号且栈为空(说明没有与之匹配的了,返回false)。
③接下来如果遇到是右括号,取出栈顶元素进行匹配,并删除该栈顶元素。一趟趟遍历完数组arr[]中的ASCII码后,如果此时栈为空,就是true,匹配成功!
public class Solution {
public bool IsValid(string s) {
//所有字符串转ASCII码
byte[] arr = System.Text.Encoding.ASCII.GetBytes(s);
//如果输入是奇数,直接排除,偶数才继续考虑
if(arr.Length%2==0){
Stack<byte> left=new Stack<byte>();
//遍历arr中的每个括号
foreach(byte item in arr){
//如果是左括号,推进栈里
if(item==40 | item==91 | item==123){
left.Push(item);
}
else{//一旦遇到右括号,弹出栈的顶部对象并删除
if(left.Count!=0){//如果左栈不为空
byte top=left.Pop();
//判断遇到的右括号是哪种
if(item==41){
if(top!=40){return false;}
}
if(item==93){
if(top!=91){return false;}
}
if(item==125){
if(top!=123){return false;}
}
}
else if(left.Count==0){//遇到右括号,但此时左栈为空
return false;
}
}
}
//此时如果栈空,说明对的
if(left.Count==0){
return true;
}else{
return false;
}
}
else{//奇数直接排除
return false;
}
}
}
执行用时:56 ms, 在所有 C# 提交中击败了99.63%的用户
内存消耗:37 MB, 在所有 C# 提交中击败了63.24%的用户
(嚯嚯!)
知识点:
- 栈及其方法:
C#中栈的用法_Will_Pixar的博客-CSDN博客_c# 栈
C#栈的简单介绍_bruce135lee的博客-CSDN博客_c# 栈
- 字符串转ASCII码:
c#怎么string转化成ascii码 - 百度文库 (baidu.com)
- ASCII码对照表:
C# 标准ASCII 码表_qq_42675313的博客-CSDN博客_c#ascii
三、其他方法
评论区看到的,用C#实现了一下
虽然运行出来时间/空间效率不高,但是思路真的牛!
思路:一轮轮迭代,每次从都取出成对的括号,如果是正确的括号匹配,那么最终字符串里就为空,即长度为0,返回true。如果是错误的括号匹配,那么最终肯定会剩下不匹配的括号,此时判断字符串长度不为0,返回false。
public class Solution {
public bool IsValid(string s) {
while(true){
int l=s.Length;
s=s.Replace("()","");
s=s.Replace("{}","");
s=s.Replace("[]","");
if(s.Length==l){return l==0;}
}
}
}
知识点:
- 字符串长度:s.Length——属性
- 字符串替换:s.Replace()——方法