抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

总时间限制: 1000ms 内存限制: 65536kB

描述

求一个字符串中最长的连续出现的字符,输出该字符及其出现次数,字符串中无空白字符(空格、回车和 tab),如果这样的字符不止一个,则输出第一个

输入

首先输入 N,即测试数据的组数
每组测试数据输入:
一行,一个不包含空白字符的字符串,字符串长度小于 200

输出

一行,输出最长的连续出现的字符及其出现次数,中间用空格隔开

样例输入

1
2
3
2
aaaaabbbbbcccccccdddddddddd
abcdefghigk

样例输出

1
2
d 10
a 1

思路

遍历字符串,记录当前字符和出现次数,如果当前字符和上一个字符相同,次数加一,否则比较当前次数和最大次数,如果当前次数大于最大次数,更新最大次数和字符,最后输出最大次数和字符。

其实,一开始我想使用 map 来解决,但是碰到了一些记录上的问题,所以最后还是使用了 pair 来解决。用 map 倒像是将问题复杂化了。

这其实就是一个简单的遍历 + 获取最大值的问题。

感谢 xcdq 的博文

Code

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <bits/stdc++.h>
using namespace std;

int main() {
int N;
cin >> N;
for(int i = 1; i <= N; i++) {
string str;
pair<char, int> tmp (0, 0), max (0, 0);
cin >> str;
for(long long unsigned int j = 0; j < str.size(); j++) {
if(tmp.first == str[j]) tmp.second++;
else {
if(tmp.second > max.second) {
max.second = tmp.second;
max.first = tmp.first;
}
tmp.second = 1;
tmp.first = str[j];
}
}
if(tmp.second > max.second) {
max.second = tmp.second;
max.first = tmp.first;
}
cout << max.first << " " << max.second << endl;
}
}

C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <string.h>

int main() {
int N;
scanf("%d", &N);
for(int i = 1; i <= N; i++) {
char str[200];
char tmp = 0, max = 0;
int count = 0, max_count = 0;
scanf("%s", str);
for(int j = 0; j < strlen(str); j++) {
if(tmp == str[j]) count++;
else {
if(count > max_count) {
max_count = count;
max = tmp;
}
count = 1;
tmp = str[j];
}
}
if(count > max_count) {
max_count = count;
max = tmp;
}
printf("%c %d\n", max, max_count);
}
}