0
点赞
收藏
分享

微信扫一扫

每日算法刷题Day8-统计最长连续字符、最长单词、倒排单词

⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法。

每日算法刷题Day8-统计最长连续字符、最长单词、倒排单词_算法

26.字符串中最长的连续出现的字符

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

输入格式

第一行输入整数 NN,表示测试数据的组数。

每组数据占一行,包含一个不含空白字符的字符串,字符串长度不超过 200200。

输出格式

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

输入样例:

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;
}


举报

相关推荐

0 条评论