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

题目:

一个合法的括号匹配序列被定义为:
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
#include
#include
#include
#include
#include
#include

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
#include
#include
#include
using namespace std;
string s;
bool judge(string);
int main(){
    int i,j;
    while(cin>>s){
        set<string> k;
        for(i=0;ichar 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;iif(x[i]=='(') stk.push(x[i]);
        else{
            if(stk.empty()) return false;
            if(stk.top()!='(') return false;
            stk.pop();
        }
    return stk.empty()==true;
}

你可能感兴趣的:(笔试题)