2017校招真题在线编程-小易喜欢的单词

题目描述

小易喜欢的单词具有以下特性:
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倒是扩展了,有时间去看一下好了。

posted @ 2018-08-09 20:58  J1ac  阅读(352)  评论(0编辑  收藏  举报