[LeetCode] Valid Parentheses、Generate Parentheses、Longest Valid Parentheses
2013-07-27 18:09
519 查看
这三道题是大摩实习现场面试时候的笔试题。
Valid Parentheses:
Given a string containing just the characters
determine if the input string is valid.
The brackets must close in the correct order,
all valid but
not.
比较简单的栈操作,但是居然还是发现有问题。一个是switch语句不会写 - -, 二个是又是拉掉一些小细节,比如匹配了之后应当出栈,又忘了,最后要判断为空也忘了,哎,算起来100分的话也就能得30分了。。。。。
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:
写的时候又犯了好几个错误,哎。尤其是rec(n+1)这里老是忘了+1.
Longest Valid Parentheses:
Given a string containing just the characters
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.
两种方法,一种是利用栈:
第二种方法类似DP,思路见/article/8613984.html:
Valid Parentheses:
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.
比较简单的栈操作,但是居然还是发现有问题。一个是switch语句不会写 - -, 二个是又是拉掉一些小细节,比如匹配了之后应当出栈,又忘了,最后要判断为空也忘了,哎,算起来100分的话也就能得30分了。。。。。
class Solution { public: bool isValid(string s) { // Start typing your C/C++ solution below // DO NOT write int main() function int n=s.length(); stack<char> st; for(int i=0;i<n;i++) { switch(s[i]) { case '(': case '[': case '{': st.push(s[i]); break; case ')': if ( st.empty() || st.top()!='(') return false; st.pop(); break; case ']': if ( st.empty() || st.top()!='[') return false; st.pop(); break; case '}': if ( st.empty() || st.top()!='{') return false; st.pop(); break; default: return false; } } return st.empty(); } };
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:
"((()))", "(()())", "(())()", "()(())", "()()()"
写的时候又犯了好几个错误,哎。尤其是rec(n+1)这里老是忘了+1.
class Solution { public: vector<string> generateParenthesis(int n) { // Start typing your C/C++ solution below // DO NOT write int main() function rec=vector<vector<string> >(n+1); solve(n ); return rec ; } vector<vector<string> > rec; void solve(int n) { if ( rec .size()!=0 ) return; if ( n==0) { rec[0]=vector<string> (1,string()); return; } else if ( n==1 ) { rec[1]=vector<string> (1,string("()")); return; } else { for(int k=0;k<n;k++) { solve(k); solve(n-1-k); vector<string>& in=rec[k]; vector<string>& out=rec[n-1-k]; int inNum=rec[k].size(); int outNum=rec[n-1-k].size(); string tmp; for(int i=0;i<inNum;i++) for(int j=0;j<outNum;j++) { tmp.clear(); tmp.push_back('('); tmp.append(in[i]); tmp.push_back(')'); tmp.append(out[j]); rec .push_back(tmp); } } } } };
Longest Valid Parentheses:
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.
两种方法,一种是利用栈:
class Solution { public: int longestValidParentheses(string s) { // Start typing your C/C++ solution below // DO NOT write int main() function typedef pair<char,int> record; stack<record> st; st.push(record('#',-1)); int ans=0; int n=s.length(); for(int i=0;i<n;i++) if ( s[i]==')'&&st.top().first=='(') st.pop(); else { ans=max(ans,i-st.top().second-1); st.push(record(s[i],i)); } ans=max(ans,n-st.top().second-1); return ans; } };
第二种方法类似DP,思路见/article/8613984.html:
class Solution { public: int longestValidParentheses(string s) { // Start typing your C/C++ solution below // DO NOT write int main() function int n=s.length(); vector<int> right(n,-1); for(int i=n-1;i>=0;i--) { if( s[i]=='(') { int j=i+1; while( j<n&&right[j]!=-1) j=right[j]+1; if ( j<n && s[j]==')') right[i]=j; } } int ans=0; for(int i=0;i<n;i++) if ( right[i]!=-1) { int j=right[i]+1; while(j<n&&right[j]!=-1) j=right[j]+1; ans=max(ans,j-i); } return ans; } };
相关文章推荐
- 【LeetCode】Valid Parentheses & Generate Parentheses & Longest Valid Parentheses
- 【LeetCode】Valid Parentheses && Generate Parentheses && Longest Valid Parentheses
- 【leetcode】括号符匹配问题(Parentheses):Valid Parentheses|Generate Parentheses|LongestValid Parentheses
- LeetCode Longest Valid Parentheses 括号匹配
- leetcode习题解答:32. Longest Valid Parentheses
- LeetCode-Longest Valid Parentheses
- leetCode4.1.2(Longest Valid Parentheses)
- LeetCode-32.Longest Valid Parentheses
- [LeetCOde46]Longest Valid Parentheses
- LeetCode刷题笔录Longest Valid Parentheses
- LeetCode 32 Longest Valid Parentheses (栈,括号匹配)
- LeetCode 32. Longest Valid Parentheses
- LeetCode 32 Longest Valid Parentheses
- Feb_0219_Leetcode_32_Longest Valid Parentheses
- [leetcode]Longest Valid Parentheses
- leetcode--Longest Valid Parentheses
- LeetCode -- Longest Valid Parentheses
- LeetCode 32. Longest Valid Parentheses
- [leetcode]Longest Valid Parentheses
- Longest Valid Parentheses--LeetCode