求一个字符串中最长的连续出现的字符,输出该字符及其出现次数,字符串中无空白字符(空格、回车和 tab),如果这样的字符不止一个,则输出第一个。
输入格式
第一行输入整数 N,表示测试数据的组数。
每组数据占一行,包含一个不含空白字符的字符串,字符串长度不超过 200。
输出格式
共一行,输出最长的连续出现的字符及其出现次数,中间用空格隔开。
输入样例:
2
aaaaabbbbbcccccccdddddddddd
abcdefghigk
输出样例:
d 10
a 1
#include <iostream>
using namespace std;
/*注意,这题要的是连续字符串长度最长的字符,如果出现如 aaabbba这种类似断了的,不连续的a,那么最后
输出的a字符的长度就是3,而不是4,因为这题只要连续都一样的字符数,而不是整个字符串里面
相等的字符有多少个,这是这个题容易踩得坑,我之前也是进坑了,最后写出来还是错的,难绷
*/
int main()
{
int n;
cin >> n;
while (n -- )//用while循环会使代码变得简洁
{
string str;
cin >> str;
int cnt = 0;//cnt用于记录最长字符串的长度
char c;//要输出的字符,即连续字符串最长的字符
for (int i = 0; i < str.size(); i ++ )//老规矩,遍历
{
int j = i;
while (j < str.size() && str[j] == str[i]) j ++ ;/*
这里设了j这个变量,用于寻找和s[i]字符相同的s[j];
这里是i不变,j从i开始遍历玩完所有的字符,再根据表达式来判断,符合要求的j就继续往后走,
直到找到不一样的字符时,j就不走了,此时j的位置就是新一轮i的开始,又是新的起点j,
然后又一直找,如此循环往复。
*/
if (j - i > cnt) cnt = j - i, c = str[i];//这里if后面的句子也会循环,记住,以分号结尾才是一句话,逗号不算一句话,所以这里要循环两个,而不是只有一个
/*这里cnt是最长字符串的长度,从头开始遍历,直到j停止,第一个连续字符串就有了,但是i和j会继续
遍历寻找,找后面的字符串,如果新的字符串长度更长,那么cnt就会更新,长度就变为最新最长的字符串长度,
因为是在for循环里面的if语句,所以会一直判断,cnt会一直随着i,j变化而变化,直到外层循环为止,
*/
i = j - 1;/*
j是遍历找连续相同字符串的中间量,当j号位的下一个是新的字符时,i值就会更新,从而又有了新的
起点,以此来遍历后面的字符串,因为每次循环完都要j++,所以i+1=j,即i=j-1;
这步也是很重要的,决定新起点,新遍历的关键
*/
}
cout << c << ' ' << cnt << endl;
//直接输出字符和次数
}
return 0;
}

详细的分析都在代码里面了,这题还是比较难的,不容易上手。
本文提供了一个C++程序,解决如何在给定的不含空白字符的字符串中找到最长连续出现的字符及其出现次数,涉及字符串处理和循环逻辑。
376

被折叠的 条评论
为什么被折叠?



