小易喜欢的单词

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

输出描述:
如果小易喜欢输出"Likes",不喜欢输出"Dislikes"
输入例子1:
AAA
输出例子1:
Dislikes 
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
	string a;
	cin>>a;
	if(1==a.size()){
		cout<<"Dislikes"<<endl;
		return 0;
	}
	vector<int>flag(a.size());
	//下面的for循环只到a.length()-2,所以额外判断a.length()-1
	if (a[a.length()-1]<'A' || a[a.length()-1]>'Z') {
		cout<<"Dislikes"<<endl;
		return 0;
	}

	for (int i=0; i<a.length()-1; i++) {

		if (a[i]<'A' || a[i]>'Z') {//是否都是大写字母
			cout<<"Dislikes"<<endl;
			return 0;
		}

		if ( a[i]==a[i+1]) {//是否有连续相等字母
			cout<<"Dislikes"<<endl;
			return 0;
		}
		int cnt=1;
		
	    //相等过的字母不再参与第二次比较
		if(flag[i]!=1)
		{
			for (int j=i+1;j<a.length(); j++) {//将只出现一次的字母替换为‘0’,如THETXH替换为TH0T0H
				if (flag[j]!=1&&a[i]==a[j]){
					flag[j]=1;
					cnt++;
				}			
			}
			if(1==cnt)
				a.replace(i, 1, "0");//i的取值[0,a.length()-2]
		}				
		
	}

	//将为'0'字符的删掉,变成THTH
	for (int i=0; i<a.length(); i++) {
		if(a[i]=='0'){
			a.erase(i,1);
			i=i-1;//删除之前i+1的位置的字母移动到了第i个位置,所以接下来循环理应继续比较第i个位置
		}
	}
	int j=0;
	for (int k=0;k<a.size();k++)
	{
		//找出跟第0个位置一样的字符,记住它位置	
		for (int i=k+1; i<a.length(); i++) {
			if (a[i]==a[k]) {
				j=i;
				break;
			}
		}
		//判断每一次字符串是不是重复出现
		for (int i=k+1; i<j; i++) {
			if(i-k+j<a.size()&&a[i]==a[i-k+j]){
				cout<<"Dislikes"<<endl;
				return 0;
			}
		}		
	}
	cout<<"Likes"<<endl;
	return 0;
}


posted @ 2017-08-10 15:02  白水冰泉  阅读(192)  评论(0编辑  收藏  举报