在一串字符串中,已知左括号位置,获取相对应的右括号位置

public static void main(String[] args) {
		String a = "vab(c {a[d]}sa)";
		Integer d = bracketsMatchedSearch(a.toCharArray(), 5);
		System.out.println(d);
		
	}
	
	/**
	 * 得到匹配括号的位置
	 * 
	 * 返回对应坐标为正常,
	 * -1表示传进来的坐标不是左括号也不是空格,是空格会顺位向后匹配直到遇到左括号
	 * -2表示不存在对应右括号(不应该出现,应该提前校验过括号配对)
	 * 
	 * @date 2018年11月22日 上午10:54:50
	 * @param checkedStr
	 * @return
	 */
	public static Integer bracketsMatchedSearch(char[] checkedCharArray, int leftIndex) {
		
		// 校验传进来的数组和索引是否为合法
		if(checkedCharArray.length < leftIndex) {
			return -1;
		}
		
		char left = checkedCharArray[leftIndex];
		// 非左括号
		if(!('(' == left || '[' == left || '{' == left)) {
			// 如果是空格则+1
			if(' ' == left) {
				return bracketsMatchedSearch(checkedCharArray, leftIndex + 1);
			} else {
				return -1;
			}
		}
		
		/*
		 *  获取传进来的是第几个左括号
		 */
		int index = 0;
		Matcher matcher = Pattern.compile("\\(|\\[|\\{").matcher(new String(checkedCharArray));
		while(matcher.find()) {
			index++;
			if(matcher.start() == leftIndex) {
				break;
			}
		}
		/*
		 *  获取另一配对括号位置
		 */
		Stack<Character> bracketsStack = new Stack<>();
		int count = 0;
		for (int i = 0; i < checkedCharArray.length; i++) {
			char c = checkedCharArray[i];
			
			// 左括号都压入栈顶,右括号进行比对
			if(c == '(' || c == '[' || c == '{') {
				count++;
				// 如果是目标,就插入*作为标记
				if(index == count) {
					bracketsStack.push('*');
				} else {
					bracketsStack.push(c);					
				}
			} else if(c == ')') {
				// 栈非空校验,防止首先出现的是右括号
				if(bracketsStack.isEmpty()) {
					return i;
				}
				Character popChar = bracketsStack.pop();
				if('*' == popChar) {
					return i;
				}
			} else if(c == ']') {
				if(bracketsStack.isEmpty()) {
					return i;
				}
				Character popChar = bracketsStack.pop();
				if('*' == popChar) {
					return i;
				}
			} else if(c == '}') {
				if(bracketsStack.isEmpty()) {
					return i;
				}
				Character popChar = bracketsStack.pop();
				if('*' == popChar) {
					return i;
				}
			}
		}
		
		return -2;
	}
执行结果
11

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值