题目描述:
写函数void MaxLenWord(char s[ ]),计算并输出串s中的最长单词。根据样例,编写主函数。
输入要求:
测试次数t
t行,每行一个字符串(不含标点符号,至少包含1个单词。单词以空格分割,无需判定单词的合法性)
输出要求:
对每行字符串输出最长单词,可能有多个,按出现顺序以空格分隔输出
#include<iostream>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<cstring>
using namespace std;
void MaxLenWord(char s[], int len)
{
int mark, curlen, maxlen, curindex, maxindex;
mark = 1;
curindex = 0;//目前下标位置
curlen = 0;//目前在读单词长度
maxlen = 0;//最长单词的长度
maxindex = 0;//最长单词的下标
for (int i = 0; i < len; i++)
{
if (!((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z')))
{
mark = 0;//如果是空格,就更改下标
curindex = i - curlen;
}
if (mark == 1)//如果不是空格,长度+1
{
curlen++;
if (i == len - 1)//判断是否为最后一个单词
{
if (curlen > maxlen)//判断最后一个单词是否为最长单词
{
maxlen = curlen;//如果是就更改最长的长度和下标
maxindex = i - curlen + 1;
}
}
}
else//如果是空格,就进行判断
{
if (curlen > maxlen)
{
maxlen = curlen;
maxindex = curindex;
}
curlen = 0;
mark = 1;
}
}
for (int i = maxindex; i < maxindex + maxlen; i++)
{
cout << s[i];//直接输出最长单词
}
int same[10000], number = 0;
mark = 1;
curindex = 0;
curlen = 0;
for (int i = maxindex + maxlen + 1; i < len; i++)//判断最长单词后面是否还有和它长度相同的单词
{
if (!((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z')))
{
mark = 0;
curindex = i;
}
if (mark == 1)
{
curlen++;
}
else
{
curlen = 0;
mark = 1;
}
if (curlen == maxlen)
{
same[number] = curindex;//记录其位置
number++;//记录个数
}
}
for (int i = 0; i < number; i++)
{
cout << " ";
for (int j = same[i] + 1; j <= same[i] + maxlen; j++)
{
cout << s[j];
}
}
cout << endl;
}
int main() {
int t;
cin >> t;
char ch0;
ch0 = getchar();
while (t--)
{
char ch[10000];
gets(ch);//接收句子
int len = strlen(ch);
ch[len] = '\0';
MaxLenWord(ch, len);
}
return 0;
}