总时间限制: 1000ms 内存限制: 65536kB
描述
求一个字符串中最长的连续出现的字符,输出该字符及其出现次数,字符串中无空白字符(空格、回车和 tab),如果这样的字符不止一个,则输出第一个
输入
首先输入 N,即测试数据的组数
每组测试数据输入:
一行,一个不包含空白字符的字符串,字符串长度小于 200
输出
一行,输出最长的连续出现的字符及其出现次数,中间用空格隔开
样例输入
1 2 3
| 2 aaaaabbbbbcccccccdddddddddd abcdefghigk
|
样例输出
思路
遍历字符串,记录当前字符和出现次数,如果当前字符和上一个字符相同,次数加一,否则比较当前次数和最大次数,如果当前次数大于最大次数,更新最大次数和字符,最后输出最大次数和字符。
其实,一开始我想使用 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); } }
|