动手刷LeetCode-判断括号有效


给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

知识点

字符串知识点:string s:常见操作方法;

解题思路

解法一:栈配对法 ;这是一个有技术含量的算法
定义res作为一个栈
遍历整个字符串,将每个左括号加入res
当发现右括号时,就查栈顶元素:
若不是其对应的左括号,直接返回false;
若是,该元素出栈,检查字符串中下一个元素;

class Solution {
public:
    bool isValid(string s) {
        // 使用栈 配对法 栈是属于算法层次
        vector<char> ans={'?'};  // vector容器即可当做一个栈空间,?只是来压栈第一个字符
        int i ;           // 定义循环变量
        int len=s.length(); // 字符串长度
        char c = s[0]; // 移动接收字符串
        char cc;    //接收栈顶元素
        if(len%2==1){
            return false;
        }

        for(i=0;i<len;i++){
            c=s[i];
            if(c==']' || c=='}'||c==')'){
                cc=ans.back(); // 取出栈顶元素
                if(cc==c-1||cc==c-2) {     // 在ASC中相对扩韩要么相差1,要么相差2
                    ans.pop_back(); // 删除栈顶元素
                } else{
                    return false;
                }
            
            }else{
                ans.push_back(c);
            }

            

        }
        if(ans.back()=='?'){
            return true;
        }
        else{
            return false;
        }
    }
};

哈希表法

如果 c 是左括号,则入栈 pushpush;
否则通过哈希表判断括号对应关系,若 stack 栈顶出栈括号 stack.pop() 与当前遍历括号 c 不对应,则提前返回 falsefalse。

class Solution:
    def isValid(self, s: str) -> bool:
        dic = {'{': '}',  '[': ']', '(': ')', '?': '?'}
        stack = ['?']
        for c in s:
            if c in dic: stack.append(c)
            elif dic[stack.pop()] != c: return False 
        return len(stack) == 1

小结

既然要做这件事情,就要付出认真的态度来对待,不要幻想再看一遍,只是自我安慰而已;第一次就要努力做到最好;

编写代码是一项技能,它涉及到使用特定的编程语言按照一定逻辑构造程序的过程。无论你是初学者还是有一定经验的学习者,“怎么写代码”这个问题可以从以下几个方面入手理解: ### 1. 学习基础语法 每种编程语言都有其独特的语法结构,这是学习该语言的第一步。例如,在Python中,缩进是非常重要的;而在C++或Java中,则需要用大括号 `{}` 来界定代码块。 ```python # Python示例:打印“Hello World” print("Hello World") ``` ```c++ // C++ 示例:打印“Hello World” #include <iostream> using namespace std; int main() { cout << "Hello World" << endl; return 0; } ``` --- ### 2. 理解核心概念 掌握基本的数据类型、控制流(如if条件判断、for循环)、函数定义及调用等知识非常重要。此外还需要熟悉一些高级的概念,比如面向对象编程(OOP)或者函数式编程(Functional Programming)。 - **变量** 和 数据类型的声明与赋值; - **流程控制**: `if`, `else`, `switch` 或其他分支语句帮助我们根据不同情况采取不同行动。 - **迭代/循环** : `while`, `do...while`, 及各种形式的 `for loop`. - 再进一步就是 类(class), 对象(object) 的创建和操作. 举个例子: ```java public class HelloWorld { public static void main(String[] args){ System.out.println("Hello world!"); // 输出 Hello world! 到屏幕 } } ``` 上面是一个典型的 Java 应用入门案例 - 它展示了如何构建一个最小可行的应用并通过其中央入口点启动运行。 --- ### 3. 动手实践 + 解决实际问题 理论终归有限,真正的进步来自于不断练习并解决问题。尝试完成小型项目或将课堂上学到的知识应用到现实场景当中去。 推荐资源: - LeetCode / HackerRank 平台提供丰富的题目库供用户挑战自我。 - GitHub 上有很多开源项目的源码可供参考学习。 --- ### 4. 良好的习惯养成 随着技术水平的增长,保持良好编码风格显得尤为重要。这不仅有助于个人长期维护自己的作品,同时也方便团队协作开发大型软件系统。 建议做法包括但不限于以下几点: - 编写清晰简洁易读的注释说明每一部分功能目的. - 给予合理命名所有组件以便直观了解作用域范围. - 遵循官方发布的代码规范指南进行排版布局.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值