给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
https://leetcode-cn.com/problems/valid-parentheses/
遇到左括号就入栈, 遇到右括号就出栈 , 看看右括号和pop出的左括号是否匹配,
如果匹配,继续遍历字符串 , 不匹配,就返回NO;
最后结束的时候,检查栈中是否情况了,如果还有值说明,不匹配
#import "ViewController.h"
@interface ViewController ()
// 用数组模拟出一个栈
@property (nonatomic, strong) NSMutableArray *array;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 测试用例
NSString *str = @"({[]})";
NSString *str1 = @"]{[]})";
NSString *str2 = @"({[]})[]";
[self invalidDesripter:str];
[self invalidDesripter:str1];
[self invalidDesripter:str2];
[self invalidDesripter:@"{}({[]})[[]]"];
[self invalidDesripter:@"{"];
}
- (BOOL)invalidDesripter:(NSString *)descripter {
if (descripter.length == 0) {
return NO;
}
NSDictionary *despriterDic = @{@"(":@")",@"[":@"]", @"{":@"}"};
for (NSInteger i = 0 ; i < descripter.length; i++) {
NSString *subStr = [descripter substringWithRange:NSMakeRange(i, 1)];
if ([despriterDic.allKeys containsObject:subStr]) {
[self.array addObject:subStr];
}else {
NSString *value = self.array.lastObject;
[self.array removeLastObject];
if ([despriterDic[value] isEqualToString:subStr]) {
continue;
}else {
NSLog(@"%@ 不可以",descripter);
return NO;
}
}
}
// 判定这种情况,比如{(),数组中有值说明没有成对出现
if (self.array.count == 0) {
NSLog(@"%@ 可以",descripter);
return YES;
}
NSLog(@"%@ 不可以",descripter);
return NO;
}
- (NSMutableArray *)array {
if (_array == nil) {
_array = [NSMutableArray array];
}
return _array;
}
@end