题目描述
考拉有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
解法一:利用sort排序。
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
bool zidian(vector<string>&arr)
{
vector<string> a;
a=arr;
sort(a.begin(),a.end());
for(int i=0;i<arr.size();i++)
{
if(a[i]!=arr[i])
{
return false;
break;
}
}
return true;
}
bool pjsort(string s1,string s2)
{
return s1.size()<s2.size();
}
bool changdu(vector<string>&arr)
{
vector<string> a;
a=arr;
sort(a.begin(),a.end(),pjsort);
for(int i=0;i<arr.size();i++)
{
if(a[i]!=arr[i])
{
return false;
break;
}
}
return true;
}
int main(){
int n;
string s;
cin>>n;
vector<string >arr;
for(int i=0;i<n;i++)
{
cin>>s;
arr.push_back(s);
}
if(zidian(arr)&&changdu(arr))
cout<<"both";
else if(!zidian(arr)&&changdu(arr))
cout<<"lengths";
else if(zidian(arr)&&!changdu(arr))
cout<<"lexicographically";
else
cout<<"none";
return 0;
}
解法二:利用std::compare()对字符串进行比较。
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int n,x=0,y=0;
string s;
cin>>n;
vector<string >arr;
for(int i=0;i<n;i++)
{
cin>>s;
arr.push_back(s);
}
for(int i=0;i<n-1;i++)
{
if(arr[i].compare(arr[i+1])>0)
x=1;
if(arr[i].size()>arr[i+1].size())
y=1;
if(x==1&&y==1)//提高效率
break;
}
if(x==0&&y==0)
cout<<"both";
else if(x==1&&y==0)
cout<<"lengths";
else if(x==0&&y==1)
cout<<"lexicographically";
else
cout<<"none";
return 0;
}