括号匹配问题:给一个字符串,其中包括小括号、中括号、大括号.求该字符串中的括号是否匹配?
例如:
()()[]{} --> 匹配
([{()}]) --> 匹配
[]{ --> 不匹配
[(]] --> 不匹配
这里可以借助栈的思想来做:
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 */