2017校招真题在线编程-小易喜欢的单词
题目描述
小易喜欢的单词具有以下特性:
1.单词每个字母都是大写字母
2.单词没有连续相等的字母
3.单词没有形如“xyxy”(这里的x,y指的都是字母,并且可以相同)这样的子序列,子序列可能不连续。
例如:
小易不喜欢"ABBA",因为这里有两个连续的'B'
小易不喜欢"THETXH",因为这里包含子序列"THTH"
小易不喜欢"ABACADA",因为这里包含子序列"AAAA"
小易喜欢"A","ABA"和"ABCBA"这些单词
给你一个单词,你要回答小易是否会喜欢这个单词(只要不是不喜欢,就是喜欢)。
1.单词每个字母都是大写字母
2.单词没有连续相等的字母
3.单词没有形如“xyxy”(这里的x,y指的都是字母,并且可以相同)这样的子序列,子序列可能不连续。
例如:
小易不喜欢"ABBA",因为这里有两个连续的'B'
小易不喜欢"THETXH",因为这里包含子序列"THTH"
小易不喜欢"ABACADA",因为这里包含子序列"AAAA"
小易喜欢"A","ABA"和"ABCBA"这些单词
给你一个单词,你要回答小易是否会喜欢这个单词(只要不是不喜欢,就是喜欢)。
输入描述:
输入为一个字符串,都由大写字母组成,长度小于100
输出描述:
如果小易喜欢输出"Likes",不喜欢输出"Dislikes"
示例1
输入
AAA
输出
Dislikes
思路:根据3种情况对字符串进行判断,其中最难得的是第三种,不能有ABAB类型的子串。
如果对所有可能的AB对进行搜索时间复杂度大致为O(n^3)?这里字符串倒也不是很长,可以尝试。
我在这里对字符串中的字母个数进行了一遍统计,然后对所有个数大于等于2的字符对进行判断,当然如果有一个字符个数多于4直接返回即可。
#include<iostream> #include<unordered_map> #include<vector> using namespace std; int main(){ string str; cin>>str; unordered_map<char,int> d; char temp = '-'; for(auto c:str){//前两个条件判断 d[c] += 1; if(c == temp || c < 'A' || c > 'Z') { cout<<"Dislikes"; return 0; } temp = c; } vector<char> chars; for(auto p: d){ //统计字符个数 if(p.second >= 4) { cout<<"Dislikes"; return 0; } if(p.second >= 2) chars.push_back(p.first); } int ss = chars.size(); if(ss < 2){ cout<<"Likes"; return 0; } for(int i = 0; i<ss; ++i){ for(int j = i+1; j<ss;++j){ bool flag = true; int remain = 4; for(int m = 0; m<str.size();++m){ //用个flag交替检测两个字符 if(str[m] == chars[i] && flag == true) {remain--;flag=!flag;} if(str[m] == chars[j] && flag == false) {remain--;flag=!flag;} } if(remain<=0){cout<<"Dislikes";return 0;} flag = false; remain = 4; for(int m = 0; m<str.size();++m){ //反向,这里代码可以省掉一点 if(str[m] == chars[i] && flag == true) {remain--;flag=!flag;} if(str[m] == chars[j] && flag == false) {remain--;flag=!flag;} } if(remain<=0){cout<<"Dislikes";return 0;} } } cout<<"Likes"; return 0; }
看网上有些答案用了正则。。。这就没什么意思了,,而且正则的东西我从来不会去记,要用的时候去查一下就好了,C++里面正则模块C++11倒是扩展了,有时间去看一下好了。
Know More ,Do More.