定义一个字符串的无序度为所有位置后面的字母比该位置的字母小的总数之和。比如"DAABEC''这个字符串的无序度是5,因为D后面有4个位置比它小(AABC),E后面有1个比它小(C),其它位置后面没有比自己小的。" AACEDGG "的无序度为1(E后面有一个D比它小)。" ZWQM "的无序度为6,每个位置后面所有的字母都比它小。
现在你的任务是给定一些字符串(只由大写字母组成),把他们按照无序度从小到大排序,如果无序度一样,那么就按照输入的相对顺序排序。
收起
输入
单组测试数据。 第一行有两个整数n(0 < n <= 50)和m (0 < m <= 100),分别表示输入的字符串的长度和字符串的个数。 接下来m行,每一行包含一个长度为n的字符串,只由大写字母组成。
输出
输出m行,表示排序之后的字符串。
输入样例
10 6 AACATGAAGG TTTTGGCCAA TTTGGCCAAA GATCAGATTT CCCGGGGGGA ATCGATGCAT
输出样例
CCCGGGGGGA AACATGAAGG GATCAGATTT ATCGATGCAT TTTTGGCCAA TTTGGCCAAA
对于如今的我来说,字符串的存储是一个重要缺陷,今天通过这道题得以突破。
思路及代码如下:
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int a,b,c,d,e,h[1000]={0},k[1000]={0},l,m;
char f[1000][1000],g[10000];
cin>>a>>b;
for(c=1;c<=b;++c)
for(d=1;d<=a;++d)
cin>>f[c][d]; //这样可以让我在已知输入多少字符串的情况下,可以通过二维数组储存字符串,简单易懂。
for(c=1;c<=b;++c)
for(d=a;d>=1;--d)
{
for(e=d-1;e>=1;--e) //通过观察我们发现每个字符串的复杂度是一个数,我们可以通过从最后的数依次的与前面比较,倘若比前面任一个数小,则确立一个数组让它+1,保证每个字符串的复杂度的保存,在本题中我设立两个数组来保存同样的复杂度,在后面会用到,在本次循环中可以得到所有字符串的复杂度。
if(f[c][d]<f[c][e]) {h[c]++;k[c]++;}
}
sort(h+1,h+b+1);//我们把一个储存复杂度的数组排序,以便于我们能把各字符串根据复杂度排序。
for(c=1;c<=b;++c)
for(d=1;d<=b;++d)
if(h[c]==k[d])//在这里就需要用到我第二个设立的数组,它的作用用来确定字符串,d就是第几个字符串,而此时c则是让第d个字符串放在c的位置。
{
for(l=1;l<=a;++l)
cout<<f[d][l];
cout<<endl;
k[d]=-1;//为了避免重复,让这个已经放在第c位的字符串对应的复杂度写成-1;可以避免重复输出。
}
return 0;
}