首页 > 代码库 > 参加微软在线测试的一道题目
参加微软在线测试的一道题目
题目 : BeautifulString
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
We say a stringis beautiful if it has the equal amount of 3 or more continuous letters (inincreasing order.)
Here are someexample of valid beautiful strings: "abc", "cde","aabbcc", "aaabbbccc".
Here are someexample of invalid beautiful strings: "abd", "cba","aabbc", "zab".
Given a stringof alphabets containing only lowercase alphabets (a-z), output "YES"if the string contains a beautiful sub-string, otherwise output "NO".
输入
The first linecontains an integer number between 1 and 10, indicating how many test cases arefollowed.
For each testcase: First line is the number of letters in the string; Second line is thestring. String length is less than 10MB.
输出
For each testcase, output a single line "YES"/"NO" to tell if the stringcontains a beautiful sub-string.
提示
Huge input. SlowIO method such as Scanner in Java may get TLE.
样例输入
4
3
abc
4
aaab
6
abccde
3
abb
样例输出
YES
NO
YES
NO
我提交并AC的解答为:
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
int i;
int T;
int N;
scanf("%d",&T);
while(T--)
{
scanf("%d",&N);
getchar();
int cnt[3], loc = 0;
char ch, pre = ‘\0‘;
bool flag = false;
//memset(cnt,0,sizeof(cnt));
for(i = 0; i < N; i++)
{
scanf("%c", &ch);
//if(ch < ‘a‘ || ch > ‘z‘) { i--; continue; }
if(flag) { continue; }
if(ch == pre){ cnt[loc]++; }
else{
if(loc == 2 && cnt[0] >= cnt[1] && cnt[2] >= cnt[1]){
flag = true;
continue;
}
else if(loc == 2 && (pre + 1 == ch)){
cnt[0] = cnt[1], cnt[1] = cnt[2];
cnt[2] = 1;
}
else if(pre + 1 == ch){
cnt[++loc] = 1;
}
else{
loc = 0;
cnt[loc] = 1;
}
pre = ch;
}
}
if(loc == 2 && cnt[0] >= cnt[1] && cnt[2] >= cnt[1]) { flag = true; }
if(flag) { printf("YES\n"); }
else { printf("NO\n"); }
}//end while
return 0;
}
基本思路是:要满足形成beautiful string,必须由连续的三个字母组成,且中间字母的数量要小于前后字母的数量,所以只要找出这个组合就行了。
参加微软在线测试的一道题目