括号匹配问题:给一个字符串,其中包括小括号、中括号、大括号.求该字符串中的括号是否匹配?
例如:
()()[]{} --> 匹配
([{()}]) --> 匹配
[]{ --> 不匹配
[(]] --> 不匹配
这里可以借助栈的思想来做:
1.遍历字符串:从左边开始,如果是字符是左括号“(”、“[”、“{”,则进行进栈操作
2.如果字符是右括号“)”、“]”、“}”
2.1.先判断栈是否为空? 为空,则不匹配;不为空,则进行2.2.
2.2.取出栈顶,看看栈顶的字符是否与右括号匹配,如果匹配,则移除栈顶,如果不匹配,则结果不匹配.
(PS:注意,右括号仅用来做判断,不会进行进栈出栈操作)
2.3.如果都不符合2.1、2.2 的情况,则不匹配
3.最后判断栈是否为空,为空则说明匹配,不为空则说明不匹配
算法解答:
这里用数组(NSMutableArray)代替栈(Stack),便于理解,原理请看我上一篇文章:CSDN
判断的代码如下:
- (BOOL)brace_match:(NSString *)str
{
NSMutableArray * resultArray = [NSMutableArray array];
NSDictionary * dic = @{@"}":@"{",@"]":@"[",@")":@"("};
//将字符串分割成单个字符并转为数组(可以看我上一篇文章的描述)
NSMutableArray * strArray = [self separateString:str];
for (NSString * ch in strArray)
{
if ([ch isEqualToString:@"{"] || [ch isEqualToString:@"["] || [ch isEqualToString:@"("])
{
[resultArray addObject:ch];
}else{
if (resultArray.count == 0)
{
return false;
}else if ([[resultArray lastObject] isEqualToString:[dic objectForKey:ch]]){
[resultArray removeObject:[resultArray lastObject]];
}else{
return false;
}
}
}
if (resultArray.count == 0)
{
return YES;
}else{
return false;
}
}
将字符串分割成单个字符并转为数组 代码:
(可以看我上一篇文章的描述:CSDN)
#pragma mark 将字符串分割成单个字符
- (NSMutableArray *)separateString:(NSString *)str
{
NSMutableArray * resultArray = [[NSMutableArray alloc]init];
for (int i = 0; i < str.length ; i ++)
{
NSRange range = NSMakeRange(i, 1);
NSString * singleStr = [str substringWithRange:range];
//将分割好的单个字符装进数组
[resultArray addObject:singleStr];
}
return resultArray;
}
最后验证一下:
NSString * braceStr = @"()[]{([])}";
BOOL braceResult = [self brace_match:braceStr];
/* braceResult为 YES */
NSString * braceStr = @"()[]{(";
BOOL braceResult = [self brace_match:braceStr];
/* braceResult为 false */