zoukankan      html  css  js  c++  java
  • 面试题37:字符串中的括号

    字符串经常出现括号的问题,主要就是产生括号对、判断括号对是否有效、最长的括号对子串。

    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:

    "((()))", "(()())", "(())()", "()(())", "()()()"

     1 class Solution {
     2 public:
     3     void helper(vector<string>& res,string path,int left,int right,int n){
     4         if(right > left || left > n || right >n) return;
     5         if(left == n){
     6             while(right < n){
     7                 path.push_back(')');
     8                 right++;
     9             }
    10             res.push_back(path);
    11             return;
    12         }
    13         path.push_back('(');
    14         helper(res,path,left+1,right,n);
    15         path.pop_back();
    16         path.push_back(')');
    17         helper(res,path,left,right+1,n);
    18     }
    19     vector<string> generateParenthesis(int n) {
    20         vector<string> res;
    21         string path;
    22         helper(res,path,0,0,n);
    23         return res;
    24     }
    25 };

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

    The brackets must close in the correct order,"()"and"()[]{}"are all valid but"(]"and"([)]"are not.

     1 class Solution {
     2 public:
     3     bool isValid(string s) {
     4         stack<char> st;
     5         for(size_t i=0;i<s.length();i++){
     6             if(s[i] == '(' || s[i] == '{' || s[i] == '['){
     7                 st.push(s[i]);
     8             }else{
     9                 if(st.empty()) return false;
    10                 if(s[i] == ')' && st.top() == '('){
    11                     st.pop();
    12                 }else if(s[i] == ']' && st.top() == '['){
    13                     st.pop();
    14                 }else if(s[i] == '}' & st.top() == '{'){
    15                     st.pop();
    16                 }else{
    17                     return false;
    18                 }
    19             }
    20         }
    21         return st.empty();
    22 
    23     }
    24 };

    Given a string containing just the characters'('and')', find the length of the longest valid (well-formed) parentheses substring.

    For"(()", the longest valid parentheses substring is"()", which has length = 2.

    Another example is")()())", where the longest valid parentheses substring is"()()", which has length = 4.

     1 class Solution{
     2 public:
     3     int longestValidParentheses(string s){
     4         stack<int> lefts; // index of left parentheses.
     5         int len = s.length();
     6         if(len < 2) return 0;
     7 
     8         int start = -1;
     9         int res = 0;
    10         for (int i=0;i<len;i++){
    11             if(s[i] == '('){
    12                 lefts.push(i);
    13             }else{
    14                 if(lefts.empty()){
    15                     start = i;
    16                 }else{
    17                     lefts.pop();
    18                     if(lefts.empty()){
    19                         res = max(res,i - start);
    20                     }else{
    21                         res = max(res,i- lefts.top());
    22                     }
    23                 }
    24             }
    25         }
    26         return res;
    27     }
    28 };
  • 相关阅读:
    string
    luogu1419 寻找段落
    vijos2024 无向图最短路径
    [Tjoi2016&Heoi2016]排序
    Vijos1083 小白逛公园
    [ZJOI2007]矩阵游戏
    NOIP2015 信息传递
    [HAOI2006]受欢迎的牛
    luogu3834 【模板】可持久化线段树 1(主席树)
    luogu2625 豪华游轮
  • 原文地址:https://www.cnblogs.com/wxquare/p/6914630.html
Copyright © 2011-2022 走看看