括号

最长的有效括号

蹲街弑〆低调 提交于 2020-02-04 19:31:52
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()" 示例 2: 输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()"思路:动态规划,只需要考虑两个有效的连续括号,()()这种形式和((()))这种形式,前一种是dp[i]=dp[i-2]+2;后面dp=dp【i-1】+2; 注意()(())结合起来。这时dp[i] = dp[i - 1] + 2 + dp[i - 1 - dp[i - 1] - 1];综合可见下面解答。 来源: https://www.cnblogs.com/zzas0/p/10533645.html

leetcode 最长有效括号

不羁岁月 提交于 2020-02-04 19:30:26
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()" 示例 2: 输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()"这道题可以用一维动态规划逆向求解。假设输入括号表达式为String s,维护一个长度为s.length的一维数组dp[],数组元素初始化为0。 dp[i]表示从s[0]到s[i]包含s[i]的最长的有效匹配括号子串长度。则存在如下关系: 1. dp[0] = 0; 2. i从1->strlen(s)-1求dp[i],并记录其最大值。若s[i] == ‘)’,则在s中从i开始到0计算dp[i]的值。这个计算分为两步,通过dp[i-1]进行的(注意dp[i -1]已经在上一步求解): (1). 在s中寻找从 i -1 结尾的有效括号匹配子串长度,即dp[i-1],跳过这段有效的括号子串,查看前一个字符,其下标为 j = i-1-dp[i-1]。若 j 没有越界,并且s[j] == ‘(’,则 s[i … j]为有效括号匹配,dp[i] =dp[i-1] + 2。 (2). 在求得了s[i … j]的有效匹配长度之后,若 j -1 没有越界,则 dp[i] 的值还要加上从 j-1 结尾的最长有效匹配,即 dp[i] += dp[j-1]

032最长有效括号

白昼怎懂夜的黑 提交于 2020-02-04 19:29:13
题目描述:    给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()" 示例 2: 输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()"解题思路: 这里我们还是借助栈来求解,需要定义个start变量来记录合法括号串的起始位置,我们遍历字符串,如果遇到左括号,则将当前下标压入栈,如果遇到右括号,如果当前栈为空,则将下一个坐标位置记录到start,如果栈不为空,则将栈顶元素取出,此时若栈为空,则更新结果和i - start + 1中的较大值,否则更新结果和i - 栈顶元素中的较大值。 1 class Solution { 2 public: 3 int longestValidParentheses(string s) { 4 if (s.size() < 2)return 0;//字符太短,无法组成括号 5 int start = 0, res = 0; 6 stack<int>num; 7 for (int i = 0; i < s.size(); ++i) { 8 if (s[i] == '(')num.push(i); 9 else { 10 if (num.empty())start = i + 1; 11 else { 12 num

leetcode 最长有效括号

白昼怎懂夜的黑 提交于 2020-02-04 19:27:13
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()" 示例 2: 输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()" 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/longest-valid-parentheses 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 class Solution { public: //令(为1,)为-1 //1.括号的匹配情况是一定的,当前缀和小于0的时候说明当前括号没法在前面匹配,直接跳过 //2.需要正向反向遍历 int longestValidParentheses(string s) { if(s.empty())return 0; int res=0; for(int i=0,cot=0,start=0;i<s.size();++i){ if(s[i]=='(')cot++; else{ cot--; if(cot==0){ res=max(res,i-start+1); } else if(cot<0){ start=i+1; cot=0; } } } for(int i=s.size()-1,cot=0,start=s

32. 最长有效括号

 ̄綄美尐妖づ 提交于 2020-02-04 12:35:44
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。 示例 1: 输入: “(()” 输出: 2 解释: 最长有效括号子串为 “()” 思路 : class Solution ( ) : def longestValidParentheses ( self , s ) : ans = 0 stack = [ - 1 ] # 先初始化一个-1,这样即使第一个相减也是得到1 for i in range ( 0 , len ( s ) ) : # 遇到左括号进栈,遇到右括号出一个左括号。 # 相当于每次计算可以消去的括号的索引差,即长度,求一个最大的长度。 if s [ i ] == "(" : stack . append ( i ) else : stack . pop ( - 1 ) if len ( stack ) == 0 : # 栈为空时,把右括号的索引加入栈中,用来后面相减 stack . append ( i ) else : ans = max ( ans , i - stack [ - 1 ] ) # i为当前数的索引,stack[-1]为上次符合条件的前一个数,相减为长度 return ans 来源: CSDN 作者: 三岁与十八 链接: https://blog.csdn.net/qq_27921205/article

20. 有效的括号 golang

笑着哭i 提交于 2020-02-04 03:21:00
借用arraystack的包完成 import "github.com/emirpasic/gods/stacks/arraystack" func isValid ( s string ) bool { stack : = arraystack . New ( ) for _ , c : = range s { if c == '(' { stack . Push ( ')' ) } else if c == '[' { stack . Push ( ']' ) } else if c == '{' { stack . Push ( '}' ) } else { if stack . Empty ( ) { return false } tempC , _ : = stack . Pop ( ) if tempC != c { return false } } } return stack . Empty ( ) } 接下来分析一下arraystack的实现 arraystack 用法 A stack based on a array list. ArrayStack A stack based on a array list . Implements Stack , IteratorWithIndex , JSONSerializer and JSONDeserializer

实验7:Problem E: STL——括号匹配

十年热恋 提交于 2020-02-02 13:40:04
Description 给出一堆括号,看其是否匹配,例如 ()、()()、(()) 这样的括号就匹配, )(、)()) 而这样的括号就不匹配 Input 每一行代表一组测试样例,每组测试样例只包含'('和')',样例长度不超过100个字符 Output 如果所有的括号都匹配,那么输出YES,否则输出NO Sample Input () )( Sample Output YES NO HINT 使用STL的stack容易实现。 Append Code #include<iostream> #include<stack> #include<string> #include<cstdio> using namespace std; int main() { string a; int i,j,n=0; while(getline(cin,a)) { stack<int> s; for(i=0;i<a.size();i++) { if(a[i]=='(') s.push(1); else if(!s.empty()) s.pop(); else break; } cout<<(i==a.size()&&s.empty()?"YES":"NO")<<endl; } return 0; } 来源: https://www.cnblogs.com/auto1945837845/p/5408903

深入理解指针函数

筅森魡賤 提交于 2020-02-02 08:38:59
1.指针函数的定义 顾名思义,指针函数即返回指针的函数。其一般定义形式如下: 类型名 *函数名(函数参数表列); 其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回的指针指向的类型”。 “(函数参数表列)”中的括号为函数调用运算符,在调用语句中,即使函数不带参数,其参数表的一对括号也不能省略。其示例如下: int *pfun(int, int); 由于“*”的优先级低于“()”的优先级,因而pfun首先和后面的“()”结合,也就意味着,pfun是一个函数。即: int *(pfun(int, int)); 接着再和前面的“*”结合,说明这个函数的返回值是一个指针。由于前面还有一个int,也就是说,pfun是一个返回值为整型指针的函数。 我们不妨来再看一看,指针函数与函数指针有什么区别? int (*pfun)(int, int); 通过括号强行将pfun首先与“*”结合,也就意味着,pfun是一个指针,接着与后面的“()”结合,说明该指针指向的是一个函数,然后再与前面的int结合,也就是说,该函数的返回值是int。由此可见,pfun是一个指向返回值为int的函数的指针。 虽然它们只有一个括号的差别

括号匹配问题

…衆ロ難τιáo~ 提交于 2020-02-01 12:06:07
括号匹配 题意 由于只包含字符的字符串’(’,’)’,’{’,’}’,’[‘和’]’,确定输入字符串是有效的。 如果输入字符串有效: 必须使用相同类型的括号关闭左括号。 必须以正确的顺序关闭打开括号。 请注意,空字符串也被视为有效。 思路 括号匹配左括号和右括号匹配使用一个HashMap存储键值对和Stack判断。 直接看代码吧。 解析 /** * 判断括号是否有效 * @param s * @return */ public boolean isValid ( String s ) { if ( s == null || s . equals ( "" ) ) { return true ; } HashMap < Character , Character > map = new HashMap < > ( ) ; Stack < Character > stack = new Stack < > ( ) ; map . put ( '(' , ')' ) ; map . put ( '[' , ']' ) ; map . put ( '{' , '}' ) ; char [ ] chars = s . toCharArray ( ) ; for ( int i = 0 ; i < chars . length ; i ++ ) { char c = chars [ i ] ;

这是括号匹配问题 不大懂1!!!!

ⅰ亾dé卋堺 提交于 2020-01-31 16:30:49
【题目描述】 在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$“标注,不能匹配的右括号用”?"标注。 【输入】 输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。 【输出】 对每组输出数据,输出两行,第一行包含原始输入字符,第二行由" " , " ? " 和 空 格 组 成 , " ","?"和空格组成," " , " ? " 和 空 格 组 成 , " “和”?"表示与之对应的左括号和右括号不能匹配。 【输入样例】 ((ABCD(x) )(rttyy())sss)( 【输出样例】 ((ABCD(x) $$ )(rttyy())sss)( ? ?$ # include <iostream> # include <stack> # include <string> # include <cstring> using namespace std ; char a [ 101 ] ; int main ( ) { stack < int > s ; string str ; while ( cin >> str ) {