【题目链接】
ybt 1143:最长最短单词
OpenJudge NOI 1.7 25:最长最短单词
【题目考点】
1. 字符串处理
【解题思路】
- 思路1:将字符串分解为多个单词,而后求出各个单词的长度,再找出最长和最短的单词。
- 思路2:遍历字符串,同时构造单词。遇到空格或逗号时完成构造一个单词,而后判断该单词是否是已知的最长或最短单词,记下最长或最短单词。
【题解代码】
解法1:用字符数组,用二维数组保存多个单词
- 将字符串拆解为多个单词,用二维数组保存。
- 遍历该二维数组,找出其中最长和最短单词。
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[205][105]; //保存分割后的多个单词,s[i]是第i个单词字符串
char c;//当前读取的字符
int w = 0, j = 0;//w:s的第一下标,表示单词编号。 j:s的第二下标,表示某单词的第几字符
while((c = getchar()) != '\n')//不断读取字符
{
if(c != ' ' && c != ',')//如果不是分隔符,那么向单词s[w]添加一个字符
s[w][j++] = c;
else if(j != 0)//如果是分隔符,且排除有连续空格或逗号的情况
{
s[w][j] = '\0';//为单词s[w]添加字符串末尾
w++;//开始填充下一个单词
j = 0;
}
}
s[w][j] = '\0';//为最后一个单词添加末尾
w++;
int wordNum = w;//单词总数量
int maxlen = 0, minlen = 200;//maxlen:最长单词长度、 minlen:最短单词长度
int max_i, min_i;//max_i:最长单词编号, min_i:最短单词编号
for(int i = 0; i < wordNum; ++i)//遍历所有单词,寻找其中最长和最短单词
{
if(strlen(s[i]) > maxlen)
{
max_i = i;
maxlen = strlen(s[i]);
}
if(strlen(s[i]) < minlen)
{
min_i = i;
minlen = strlen(s[i]);
}
}
puts(s[max_i]);//puts输出一个字符串后自动输出换行符
puts(s[min_i]);
return 0;
}
解法2:用string类,遍历字符串,构造单词并看其是否是最长或最短单词
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s, word, maxWord, minWord;//s:输入的字符串 word:分解出的一个单词 maxWord:最长单词 minWord最短单词
getline(cin, s);
s += ' ';//字符串末尾加上一个空格分隔符,便于统一处理
int wst = 0, wlen = 0;//wst:单词的起始位置 wlen:单词的长度
int minLen = 200, maxLen = 0;//minLen:最短长度 maxLen:最大长度
for(int i = 0; i < s.length(); ++i)
{
if(s[i] == ' ' || s[i] == ',')//如果遇到分隔符
{
if(wlen > 0)//wlen > 0 排除有连续的分隔符的情况
{
word = s.substr(wst, wlen);//从wst位置到i-1位置构成一个单词,其长度为wlen,截取该单词
if(wlen > maxLen)//如果该单词比最长单词长,那么该单词就是最长单词
{
maxWord = word;
maxLen = wlen;
}
if(wlen < minLen)//如果该单词比最短单词短,那么该单词就是最短单词
{
minWord = word;
minLen = wlen;
}
}
wst = i + 1;//分隔符的下一个位置作为下一个单词的起始位置
wlen = 0;
}
else//如果遇到一般字符
wlen++;//增加该单词长度
}
cout<<maxWord<<endl;
cout<<minWord<<endl;
return 0;
}