題目描述:
考拉有n個字符串字符串,任意兩個字符串長度都是不同的。考拉最近學習到有兩種字符串的排序方法: 1.根據字符串的字典序排序。例如:
“car” < “carriage” < “cats” < “doggies < “koala”
2.根據字符串的長度排序。例如:
“car” < “cats” < “koala” < “doggies” < “carriage”
考拉想知道自己的這些字符串排列順序是否滿足這兩種排序方法,考拉要忙着吃樹葉,所以需要你來幫忙驗證。
輸入描述:
輸入第一行爲字符串個數n(n ≤ 100)
接下來的n行,每行一個字符串,字符串長度均小於100,均由小寫字母組成
輸出描述:
如果這些字符串是根據字典序排列而不是根據長度排列輸出”lexicographically”,
如果根據長度排列而不是字典序排列輸出”lengths”,
如果兩種方式都符合輸出”both”,否則輸出”none”
輸入例子:
3
a
aa
bbb
輸出例子:
both
算法分析:
分別編寫判斷字典排序和長度排序的函數。在主函數中,分別調用這兩個函數來判斷該組字符串,通過返回值的不同情況,給出結果。
定義兩個函數isLex()和isLen()分別來判斷字符串組是否是字典序和長度序。
字典序的判斷辦法是:依次從字符串組中取出相鄰的兩個字符串,定義一個下標i,從前到後掃描字符串(兩個字符串長度中較小的一個作爲i的最大長度),判斷連個字符串在i位置的字符大小,如果字符串A在i位置的字符大於字符串B,則該兩個字符串是字典序,如果字符串A在i位置的字符小於字符串B,則該兩個字符串不是字典序,如果字符串A在i位置的字符等於字符串B在i位置的字符,i自加1,再次判斷下一個字符,如果i超過它的最大長度,則說明字符串A的前i個字符與字符串B的前i個字符相同,此時,比較字符串A的長度是否小於字符串B,如果小於,是字典序,否則不是字典序。
長度序的判斷方法相比於字典序則簡單的多:依次從字符串組中取出相鄰的兩個字符串,利用.size()函數得到這兩個字符串的長度,如果前者的字符串長度小於等於後者,則繼續便利字符串組,若大於後者,則遍歷終止,返回flag值。
然後再main函數中,分四種情況對isLex()和 isLen()函數的返回值進行討論,輸出結果即可。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
bool isLexi(vector<string> vecStr);
bool isLen(vector<string> vecStr);
bool comStr(string, string);
int main(void)
{
int n;
cin >> n;
vector<string> vecStr;
bool flagLexi = false, flagLen = false;
while(n--)
{
string temp;
cin >> temp;
vecStr.push_back(temp);
}
flagLexi = isLexi(vecStr);
flagLen = isLen(vecStr);
if ( true == flagLexi && true == flagLen)
{
cout << "both" << endl;;
}
else if ( true == flagLexi)
{
cout << "lexicographically" << endl;
}
else if ( true == flagLen )
{
cout << "lengths" << endl;
}
else
{
cout << "none" << endl;
}
return 0;
}
bool isLexi(vector<string> vecStr)
{
bool flag = true;
if (vecStr.empty())
return flag;
for (unsigned int i = 0; i < vecStr.size() - 1; ++i)
{
if ( true == comStr(vecStr[i], vecStr[i+1]))
{
flag = true;
}
else
{
flag = false;
break;
}
}
return flag;
}
bool isLen(vector<string> vecStr)
{
bool flag = true;
if (vecStr.empty())
return flag;
for (unsigned int i = 0; i < vecStr.size() - 1; ++i)
{
if (vecStr[i].size() <= vecStr[i+1].size())
{
flag = true;
}
else
{
flag = false;
break;
}
}
return flag;
}
bool comStr(string first, string second)
{
bool flag = true;
if (first.empty() && second.empty())
return true;
if (first.empty())
return false;
if (second.empty())
return true;
unsigned int i;
for (i = 0; i < first.size() && i < second.size();)
{
if (first[i] == second[i])
{
flag = true;
i++;
}
else if (first[i] < second[i])
{
flag = true;
break;
}
else
{
flag = false;
break;
}
}
if (i == first.size() || i == second.size())
{
if ( first.size() <= second.size())
{
flag = true;
}
else
{
flag = false;
}
}
return flag;
}
若有不對之處,敬請指正。