您的位置:首页 > 其它

[LeetCode] Valid Parentheses、Generate Parentheses、Longest Valid Parentheses

2013-07-27 18:09 519 查看
这三道题是大摩实习现场面试时候的笔试题。

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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: