题目描述
考拉有n个字符串字符串,任意两个字符串长度都是不同的。考拉最近学习到有两种字符串的排序方法: 1.根据字符串的字典序排序。例如:
"car" < "carriage" < "cats" < "doggies < "koala"
2.根据字符串的长度排序。例如:
"car" < "cats" < "koala" < "doggies" < "carriage"
考拉想知道自己的这些字符串排列顺序是否满足这两种排序方法,考拉要忙着吃树叶,所以需要你来帮忙验证。输入描述:
输入第一行为字符串个数n(n ≤ 100) 接下来的n行,每行一个字符串,字符串长度均小于100,均由小写字母组成输出描述:
如果这些字符串是根据字典序排列而不是根据长度排列输出"lexicographically", 如果根据长度排列而不是字典序排列输出"lengths", 如果两种方式都符合输出"both",否则输出"none"示例1
输入
3 a aa bbb输出
both
解题思路:
根据题意,就是判断出来长度是否符合条件和所有字符串符合字典序。并且对这两种情况的不同组合进行分别打印不同的语句。
长度的排序比较简单,就是一一比较相邻的字符串长度,发现一个不符合就不符合长度排序。
对于字典序,像查字典一样,先比较相邻字符串的第一个字母,三种情况:
- 1.前一个字符串首字母小于后一个字符串首字母时直接判断下一对。
- 2.前一个字符串首字母大于后一个字符串首字母时直接停止,不符合。
- 3.则前一个字符串首字母等于后一个字符串首字母时,就需要接着比较两个字符串下一个字母,重复一个步骤
实例代码:
#include<iostream>
using namespace std;
#include<vector>
#include<string>
void Dispose(vector<string>& v)
{
int LengthFlag = 0;
int ZiDianXuFlag = 0;
int size = v.size();
if(v.size() == 1)
{
cout<<"both"<<endl;
return;
}
for(int i = 0; i < size - 1; i++)
{
if(v[i].size() > v[i+1].size())
{
LengthFlag = 1;
break;
}
}
for(int i = 0; i < size - 1; i++)
{
int SizeStr = v[i].size();
for(int j = 0; j < SizeStr; j++)
{
if(v[i][j] < v[i+1][j])
{
break;
}
if(v[i][j] > v[i+1][j])
{
ZiDianXuFlag = 1;
break;
}
}
}
if(ZiDianXuFlag == 0 && LengthFlag == 1)
{
cout<<"lexicographically"<<endl;
}
else if(ZiDianXuFlag == 1 && LengthFlag == 0)
{
cout<<"lengths"<<endl;
}
else if(ZiDianXuFlag == 0 && LengthFlag == 0)
{
cout<<"both"<<endl;
}
else
{
cout<<"none"<<endl;
}
}
int main()
{
vector<string> v;
string str;
int count = 0;
while(cin>>count)
{
for(int i = 0; i < count; i++)
{
cin>>str;
v.push_back(str);
str.clear();
}
Dispose(v);
}
return 0;
}
在做题中遇到的问题:
1.由于粗心在输入字符串时直接用v[i]来接收。vector都没数据空间怎么能以数组的形式存放。
2.判断字典序时,考虑不周,一开始只考虑了第三种情况。造成只通过一部分测试用例。
珍&源码