网易笔试题:小易喜欢的单词

小易喜欢的单词具有以下特性:
 1.单词每个字母都是大写字母
 2.单词没有连续相等的字母
 3.单词没有形如“xyxy”(这里的x,y指的都是字母,并且可以相同)这样的子序列,子序列可能不连续。
 例如:
 小易不喜欢"ABBA",因为这里有两个连续的'B'
 小易不喜欢"THETXH",因为这里包含子序列"THTH"
 小易不喜欢"ABACADA",因为这里包含子序列"AAAA"
 小易喜欢"A","ABA"和"ABCBA"这些单词
 给你一个单词,你要回答小易是否会喜欢这个单词。

输入描述:
输入为一个字符串,都由大写字母组成,长度小于100
输出描述:

如果小易喜欢输出"Likes",不喜欢输出"Dislikes" 


C++代码:

#include 

using namespace std;

int findLCS(string A, int n, string B, int m) {// 最长公共子序列
    string strA = "#" + A;
    string strB = "#" + B;
    int C[n+1][m+1];
    for(int i=0; i <= n; i++)
        C[i][0] = 0;
    for(int i=0; i <= m; i++)
        C[0][i] = 0;
    for(int i=1; i <= n; i++) {
        for(int j=1; j <= m; j++) {
            if(strA[i] == strB[j])
                C[i][j] = C[i-1][j-1] + 1;
            else if(C[i-1][j] > C[i][j-1])
                C[i][j] = C[i-1][j];
            else
                C[i][j] = C[i][j-1];
        }
    }
    return C[n][m];
}

bool isLikeWord(const string& str) {
    for(string::size_type i=0; i < str.size()-1; i++) {
        for(string::size_type j=i+1; j < str.size(); j++) {
            string s = "";
            s = s + str[i] + str[j] + str[i] + str[j];
            if(4 == findLCS(str, str.size(), s, s.size()))
                return false;
        }
    }
    return true;
}

int main() {
    string str;
    while(cin >> str) {
        bool isLike = true;
        int flag[256] = {0};
        for(string::size_type i=0; i < str.size(); i++) {
            if((str[i] < 'A' || str[i] > 'Z')  ||  ++flag[str[i]] >= 4  ||  (i+1 < str.size() && str[i] == str[i+1])) {// 必须是大写字母、不存在4个及以上的字母、不存在连续的字母
                isLike = false;
                break;
            }
        }
        if(isLike) {
            isLike = isLikeWord(str);// 取每两个字符组成 xyxy 和 字符串求最大公共子序列,若最后求得的长度正好为 4 说明,包含在里面
        }
        if(isLike)
            cout << "Likes" << endl;
        else
            cout << "Dislikes" << endl;
    }
    return 0;
}


你可能感兴趣的:(编程)