您的位置:首页 > 其它

2018网易--最长公共子括号序列

2017-09-20 19:55 288 查看
题目:

一个合法的括号匹配序列被定义为:

1. 空串”“是合法的括号序列

2. 如果”X”和”Y”是合法的序列,那么”XY”也是一个合法的括号序列

3. 如果”X”是一个合法的序列,那么”(X)”也是一个合法的括号序列

4. 每个合法的括号序列都可以由上面的规则生成

例如”“, “()”, “()()()”, “(()())”, “(((()))”都是合法的。

从一个字符串S中移除零个或者多个字符得到的序列称为S的子序列。

例如”abcde”的子序列有”abe”,”“,”abcde”等。

定义LCS(S,T)为字符串S和字符串T最长公共子序列的长度,即一个最长的序列W既是S的子序列也是T的子序列的长度。

小易给出一个合法的括号匹配序列s,小易希望你能找出具有以下特征的括号序列t:

1、t跟s不同,但是长度相同

2、t也是一个合法的括号匹配序列

3、LCS(s, t)是满足上述两个条件的t中最大的

因为这样的t可能存在多个,小易需要你计算出满足条件的t有多少个。

如样例所示: s = “(())()”,跟字符串s长度相同的合法括号匹配序列有:

“()(())”, “((()))”, “()()()”, “(()())”,其中LCS( “(())()”, “()(())” )为4,其他三个都为5,所以输出3.

输入描述:

输入包括字符串s(4 ≤ |s| ≤ 50,|s|表示字符串长度),保证s是一个合法的括号匹配序列。

输出描述:

输出一个正整数,满足条件的t的个数。

输入例子1:

(())()

输出例子1:

3

程序:

AC50%(超时)

#include<iostream>
#include<string>
#include<set>
#include<algorithm>
#include<vector>
#include<stack>
#include<map>

using namespace std;

bool isValid(string s)
{
stack<char> st;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '(')
st.push(')');
else if (st.empty())
return false;
else
st.pop();

}
if (st.empty())
return true;
else
return false;
}

int main()
{
string s;
cin >> s;
if (s.size() % 2 == 1)
{
cout << "0" << endl;
return 0;
}
if (s.size() == 2)
{
cout << "0" << endl;
return 0;
}

if (s.size() == 4)
{
cout << "1" << endl;
return 0;
}

int len = s.size();
string str="";
for (int i = 0; i < len/2; i++)
str = str + "()";
sort(str.begin(), str.end());
set<string> all_str;
do
{
//cout << str << endl;
if (isValid(str))
all_str.insert(str);
} while (next_permutation(str.begin(), str.end()));

map<string, int> m;
for (int i = 0; i < len; i++)
{
auto it = s.begin() + i;
string ss ;
if (i == 0)
ss = s.substr(1, len - 1);
else if (i == len - 1)
ss = s.substr(0, len - 1);
else
ss = s.substr(0, i) + s.substr(i + 1, len - 1 - i);
//cout << ss << endl;
m[ss] = i;
}

/*for (auto it = all_str.begin(); it != all_str.end(); ++it)
if (*it == s)
all_str.erase(it);*/
int count = 0;
for (auto it = all_str.begin(); it != all_str.end(); ++it)
{
if (*it == s)
continue;
string temp = *it;
for (int i = 0; i < len; i++)
{
auto it = temp.begin() + i;
string ss;
if (i == 0)
ss = temp.substr(1, len - 1);
else if (i == len - 1)
ss = temp.substr(0, len - 1);
else
ss = temp.substr(0, i) + temp.substr(i + 1, len - 1 - i);
if (m.find(ss) != m.end())
{
count++;
break;
}
}
}

cout << count << endl;
return 0;

}


AC(100%)

#include<iostream>
#include<string>
#include<set>
#include<stack>
using namespace std;
string s;
bool judge(string);
int main(){
int i,j;
while(cin>>s){
set<string> k;
for(i=0;i<s.length();i++){
char t=s[i];
string tmp=s;
tmp.erase(tmp.begin()+i);
for(j=0;j<=tmp.length();j++){
string ti=tmp;
ti.insert(ti.begin()+j,t);
k.insert(ti);
}
}
int res=0;
for(set<string>::iterator it=k.begin();it!=k.end();it++)
judge(*it)?res++:res=res;
printf("%d\n",res);
}
}
bool judge(string x){
if(x==s) return false;
stack<char> stk;
for(int i=0;i<x.length();i++)
if(x[i]=='(') stk.push(x[i]);
else{
if(stk.empty()) return false;
if(stk.top()!='(') return false;
stk.pop();
}
return stk.empty()==true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网易