Parentheses(圆括号)匹配与生成

20. Valid Parentheses合法括号

Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.

An input string is valid if:

  1. Open brackets must be closed by the same type of brackets.
  2. Open brackets must be closed in the correct order.

Note that an empty string is also considered valid.

Example 1:

Input: "()"
Output: true

Example 2:

Input: "()[]{}"
Output: true

Example 3:

Input: "(]"
Output: false

分析:本题构造一个栈,open括号进栈,close括号检查栈是否非空且栈顶元素为对应的open符号,否则返回false,结束后若栈空返回true。

class Solution {
public:
    bool isValid(string s) {
        int l = s.size();
        stack<char> st;
        for(int i=0;i<l;i++)
        {
            char c = s[i];
            if(c=='('  || c=='[' || c=='{')
                st.push(c);
            else
            {
                if(st.empty())
                    return false;
                if(c==')')
                    if(st.top() == '(')
                        st.pop();
                    else
                        return false;
                else if(c==']')
                    if(st.top() == '[')
                        st.pop();
                    else
                        return false;
                else if(c=='}')
                    if(st.top() == '{')
                        st.pop();
                    else
                        return false;
            }
        }
        if(st.empty())
            return true;
        return false;
 
    }
};

22. Generate Parentheses生成括号

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

分析:本题可使用回溯法解决,回溯法其实就是DFS加剪枝,这里我们添加两个剪枝条件:

1.先尝试添加左括号,如果左括号数目小于n

2.再尝试添加右括号数目,如果右括号数目小于当前左括号数目

所以我们的回溯函数有五个参数,分别为:ans,当前string,left数目,right数目,n

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> ans;
        backtrack(ans,"",0,0,n);
        return ans;
        
    }
    void backtrack(vector<string> &ans, string cur, int left, int right,int max)
    {
        if(cur.size()==max*2)
        {
            ans.push_back(cur);
            
            return;
        }
        if(left<max)
            backtrack(ans,cur+'(',left+1,right,max);
        if(right<left)
            backtrack(ans,cur+')',left,right+1,max);
    }
};

 

### 回答1: 以下是Python编写的匹配左右圆括号的代码: ```python def check_parenthesis(string): """ 检查圆括号是否匹配 """ stack = [] # 用栈来存储左括号的位置 for i in range(len(string)): if string[i] == '(': stack.append(i) elif string[i] == ')': if len(stack) == 0: return False stack.pop() return len(stack) == 0 # 测试case print(check_parenthesis('()')) # True print(check_parenthesis('(()())')) # True print(check_parenthesis('(())(')) # False print(check_parenthesis(')(')) # False ``` ### 回答2: Python可以通过使用栈来判断左右圆括号是否匹配。 首先,我们创建一个空栈,然后遍历给定的编码。如果遇到左圆括号('('),我们将其放入栈中。如果遇到右圆括号(')'),则需要检查栈是否为空。如果栈为空,则表示右圆括号与前面没有对应的左圆括号,因此不匹配。如果栈不为空,则从栈中弹出一个左圆括号,表示找到了对应的配对。遍历完成后,如果栈不为空,也表示存在未配对的左圆括号,所以不匹配。 以下是一个示例函数来检查左右圆括号匹配: def check_parentheses(code): stack = [] for char in code: if char == '(': stack.append(char) elif char == ')': if len(stack) == 0: return False stack.pop() return len(stack) == 0 该函数接受一个编码字符串作为参数,并返回一个布尔值,表示括号是否匹配。当遇到左圆括号时,将其推入栈中,当遇到右圆括号时,弹出栈顶的左圆括号。最后,检查栈是否为空,以确定括号是否完全匹配。 该函数的运行时间与代码中括号的数量成线性关系,所以时间复杂度为O(n),其中n是编码中圆括号的总数。 ### 回答3: 编写一个程序来检测给定字符串中的左右圆括号是否匹配。 首先,我们可以声明一个栈来存储左圆括号。然后我们遍历给定的字符串,如果遇到左圆括号,我们将其推入栈中。如果遇到右圆括号,我们检查栈是否为空。如果栈不为空,则弹出栈顶元素,表示找到了匹配的左圆括号。否则,我们就得出左右圆括号匹配。 最后,我们需要检查栈是否为空。如果栈不为空,则意味着存在无法匹配的左圆括号,即左右圆括号匹配。如果栈为空,则表示所有的左右圆括号匹配。 这个算法的时间复杂度为O(n),其中n是字符串的长度。以下是使用Python编写的示例代码: ```python def check_parentheses(s): stack = [] for char in s: if char == '(': stack.append(char) elif char == ')': if len(stack) > 0: stack.pop() else: return False return len(stack) == 0 # 测试代码 s1 = "((()))" # 左右圆括号匹配 s2 = "(()))" # 左右圆括号匹配 print(check_parentheses(s1)) # 输出:True print(check_parentheses(s2)) # 输出:False ``` 通过这个算法,我们可以判断给定字符串中的左右圆括号是否匹配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值