LeetCode06-有效的括号

在这里插入图片描述
栈的方法以及特性

package com.example.demo;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.HashMap;
import java.util.Map;

@RunWith(SpringRunner.class)
@SpringBootTest
public class EnableBrackets {

	@Test
	public void contextLoads() {
		boolean s=isValid("{}");
		System.out.println(s);
	}

    /**
     * 第一个想法 遍历每一个字符,然后放到一个字符串里面,然后判断当前字符与字符串中的位置之间是否相同,相同的差是多少 ,差是1则消除当前两个字符串
	 * 最后判断结果字符串是否为空
	 * 执行用时 :15 ms, 在所有 java 提交中击败了9.23%的用户
	 * 内存消耗 :36.1 MB, 在所有 java 提交中击败了43.22%的用户
	 * @param s
     * @return
     */
	public boolean isValid(String s) {
		Map<Character,Character> map=new HashMap<>();
		map.put(')','(');
		map.put('}','{');
		map.put(']','[');
		boolean isValid=false;
		String result="";
		for (int i = 0; i < s.length(); i++) {
				char cur=s.charAt(i);
				result += cur;
				if(cur=='('||cur=='{'||cur=='['){
					isValid=true;
				}else{
					if(result.lastIndexOf(map.get(cur))!=-1&&result.lastIndexOf(map.get(cur)) == result.indexOf(cur) - 1) {
							result = result.substring(0,result.lastIndexOf(map.get(cur)));
							isValid=true;
					}else{
						isValid=false;
					}
				}
				if(result.length()>0){
					isValid=false;
				}
			}
		if(s.equals("")){
			isValid=true;
		}
		return isValid;
	}

     /**
     * 第二个想法 :因为第一个想法的速度太过于慢,然后继承了第一个想法的消除,反正最后相匹配的话
	 * 最根源的{}[]()都是成对的,然后我可以消除他,
	 * 执行用时 :154 ms, 在所有 java 提交中击败了5.02%的用户
	 * 	内存消耗 :36.7 MB, 在所有 java 提交中击败了33.14%的用户
	 * 	但是结果显而易见的差
	 * @param s
     * @return
     */
	public boolean isValid2(String s) {
	while (s.contains("[]")||s.contains("{}")||s.contains("()")){
		s=s.replace("[]","");
		s=s.replace("{}","");
		s=s.replace("()","");
		}
		if(s.length()>0){
			return false;
		}
		return true;

	}
	/**
	 * 第三个想法 :因为前两个想法都tm的蠢,所以借鉴了一下网上的栈处理,通过进栈出栈的方式去做
	 * 逻辑和前两个方法差不多,都是遇到匹配的就消除,不过栈处理更快
	 * @param s
	 * @return
	 */
	public boolean isValid3(String s) {
		Stack<Character> stack=new Stack<>();
		Map<Character,Character> map=new HashMap<>();
		map.put(')','(');
		map.put('}','{');
		map.put(']','[');
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);//获取当前字符
			//如果是左符号就push进栈
			if (map.containsKey(c)) {
				//判断栈顶元素是否为当前符号的对应的左符号
				char topElement = stack.empty() ? '#' : stack.pop();
				if (topElement != map.get(c)) {
					return false;
				}
			}else{
				stack.push(c);
			}
		}
		return stack.isEmpty();

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值