您的位置:首页 > 编程语言 > C语言/C++

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

2016-08-16 14:42 253 查看
小易喜欢的单词具有以下特性:

 1.单词每个字母都是大写字母

 2.单词没有连续相等的字母

 3.单词没有形如“xyxy”(这里的x,y指的都是字母,并且可以相同)这样的子序列,子序列可能不连续。

 例如:

 小易不喜欢"ABBA",因为这里有两个连续的'B'

 小易不喜欢"THETXH",因为这里包含子序列"THTH"

 小易不喜欢"ABACADA",因为这里包含子序列"AAAA"

 小易喜欢"A","ABA"和"ABCBA"这些单词

 给你一个单词,你要回答小易是否会喜欢这个单词。

输入描述:

输入为一个字符串,都由大写字母组成,长度小于100
输出描述:
如果小易喜欢输出"Likes",不喜欢输出"Dislikes" 

C++代码:

#include <iostream>

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