算法题-字符串中的有效括号

leetcode链接:https://leetcode-cn.com/problems/valid-parentheses/

题目描述

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:

输入:s = “()”
输出:true
示例 2:

输入:s = “()[]{}”
输出:true
示例 3:

输入:s = “(]”
输出:false
示例 4:

输入:s = “([)]”
输出:false
示例 5:

输入:s = “{[]}”
输出:true

解题思路1

题目分析

像这种判断有效性的题目往往用栈来操作是非常方便的,我们可以如下的思路分析

创建一个栈Stack和一个Map,Map中存储三个键值对 “()”、"[]"、"{}",键值对都是字符类型

然后我们遍历字符串中的每个字符,拿到字符value,用我们拿到的字符value和栈顶的字符key比较,如果栈顶的字符key对应到Map中的值value1==value,则认为这是一对有效的括号,将栈顶字符出栈。否则将字符value入栈。

一次遍历完成后如果Stack为空,则证明这个字符串是有效的括号。

解题代码

我写的效率还是差了点,只大白了14%的人,但是足够说明原理了。(()]

class Solution {
    public boolean isValid(String s) {
        if(s.length()==0){
            return true;
        }
        Map<Character,Character> map = new HashMap();//创建map用于存储键值对
        Stack<Character> stack = new Stack();//创建栈用于存储字符串中的字符
        map.put('(',')');
        map.put('[',']');
        map.put('{','}');
        for(int i=0;i<s.length();i++){
            Character indexChar = s.charAt(i);
            if(!stack.isEmpty()){
                char temp = stack.peek();
                Character value = map.get(temp);
                if(value!=null&&value==indexChar){//如果栈顶字符对应的value不为空且值等于遍历中的item,则栈顶字符出栈
                    stack.pop();
                }else{
                    stack.push(indexChar);//否则吧正在遍历的父子入栈
                }
            }else{
                stack.push(indexChar);//空栈入栈
            }
        }
        return stack.isEmpty();//如果栈是空的则字符串是合法括号
    }
}

解题思路2

这种解题思路意义并不大,已不可能实际应用中被采用,按需观看即可

通过分析我们知道只几个括号(){}[]的ascii字符分别是:40、41、123、125、91、93

因此仍然使用栈的方式解题

每次比较遍历中的字符串的字符c1和栈顶的字符c2的差,如果要保证这两者是一对有效括号则必须满足有 b=c1-c2 ,b的值满足条件b>0且b<3,否则不满足

因为少了Map的构建所以效率可以提升一大截

解题代码

class Solution {
    public boolean isValid(String s) {
        //"(){}[]"几个字符asciit的值分别是40、41、123、125、91、93
        Stack<Character> stack = new Stack();
        for(int i=0;i<s.length();i++){
            if(stack.isEmpty()){//如果栈空直接入栈
                stack.push(s.charAt(i));
                continue;
            }
            char indexChar = s.charAt(i);//获取字符串中的字符
            Character stackChar = stack.peek();//获取栈顶字符
            if(stackChar==null||indexChar==stackChar){//如果栈顶字符为空,或者两个字符相同则遍历的字符串直接入栈
                stack.push(indexChar);
            }else{
                int b = indexChar-stackChar;
                if(b<3&&b>0){//如果遍历的字符与栈顶字符串的差值满足提交则栈顶元素出栈
                    stack.pop();
                }else{
                    stack.push(indexChar);
                }
            }
        }
        return stack.isEmpty();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于原生代码的 JSON 字符串算法,一种常见的方法是使用递归或迭代来解析和构建 JSON 对象。下面是一个简单的示例算法: 1. 解析 JSON 字符串: - 遍历输入的 JSON 字符串,逐个字符进行处理。 - 忽略空格和换行符。 - 根据字符类型进行不同的处理: - 如果是左花括号 `{`,表示开始一个 JSON 对象。 - 如果是右花括号 `}`,表示结束当前 JSON 对象。 - 如果是左方括号 `[`,表示开始一个 JSON 数组。 - 如果是右方括号 `]`,表示结束当前 JSON 数组。 - 如果是逗号 `,`,表示当前 JSON 对象或数组的元素结束。 - 如果是冒号 `:`,表示键值对的分隔符。 - 如果是双引号 `"``"``"``"`,表示一个字符串的开始和结束。 - 根据上述规则解析出键值对,构建 JSON 对象或数组的数据结构。 2. 构建 JSON 字符串: - 遍历 JSON 对象或数组的数据结构。 - 递归或迭代处理每个键值对,并将其转换为字符串格式。 - 如果值是字符串类型,则在字符串两侧添加双引号。 - 将键值对按照 `键:值` 的格式组合起来。 - 将多个键值对使用逗号 `,` 连接起来。 - 在 JSON 对象外部添加左花括号 `{` 和右花括号 `}`,在 JSON 数组外部添加左方括号 `[` 和右方括号 `]`。 这只是一个简单的算法示例,实际上,处理 JSON 字符串算法可能更复杂,需要考虑更多的语法规则和错误处理。在实际开发,可以使用现有的 JSON 解析库来处理 JSON 字符串,以避免重复造轮子。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值