26.字符串中最长的连续出现的字符
求一个字符串中最长的连续出现的字符,输出该字符及其出现次数,字符串中无空白字符(空格、回车和 tabtab),如果这样的字符不止一个,则输出第一个。
输入格式
第一行输入整数 N,表示测试数据的组数。
每组数据占一行,包含一个不含空白字符的字符串,字符串长度不超过 200。
输出格式
共一行,输出最长的连续出现的字符及其出现次数,中间用空格隔开。
输入样例:
2
aaaaabbbbbcccccccdddddddddd
abcdefghigk
输出样例:
d 10
a 1
思路
筛选相同项通常会使用到双指针的思想,这里是第一类双指针。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
string str;
cin>>str;
int cnt = 0;
char c;
for(int i = 1; i<str.size(); i++)
{
int j = i;
while(j < str.size() && str[j] == str[i])j++;
if(j - i > cnt) cnt = j -i, c = str[i];
i = j - 1;
}
cout << c << ' ' << cnt <<endl;
}
return 0;
}
27.最长单词
一个以 .
结尾的简单英文句子,单词之间用空格分隔,没有缩写形式和其它特殊形式,求句子中的最长单词。
输入格式
输入这个简单英文句子,长度不超过 500500。
输出格式
该句子中最长的单词。如果多于一个,则输出第一个。
输入样例:
I am a student of Peking University.
输出样例:
University
思路
.back()与.pop_back()
这里要特别注意两个函数。分别是
- .back() 返回字符串的最后一个字符
- .pop_back() 删除字符串的最后一个字符
还要注意这种比较传递的思想。
#include<iostream>
using namespace std;
int main()
{
string res,str;
while(cin >> str)
{
if(str.back() == '.')str.pop_back();
if(str.size() > res.size())res = str;
}
cout<<res<<endl;
return 0;
}
28.倒排单词
编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔。
输入格式
输入为一个字符串(字符串长度至多为 100100)。
输出格式
输出为按要求排序后的字符串。
输入样例:
I am a student
输出样例:
student a am I
思路:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str[100];
int n = 0;
while(cin >> str[n])n++;
//特别注意这里i = n - 1;因为上面读入时会将空格一起读入进去。这里避免输出空格,从而造成Presentation Error
for(int i = n-1 ; i >=0;i --)cout<<str[i] <<" ";
cout<<endl;
return 0;
}
也可以更简单,采用到着拼接的方法完成。
#include <iostream>
using namespace std;
int main()
{
string str, res;
while (cin >> str)
res = str + ' ' + res;
cout << res;
return 0;
}