注意行之间的比较结果与高位的字符有关,若s1[i] < s2[i + 1],则后面的字符不用考虑;相等时才需考虑。
使用布尔数组来记录相邻行之间的大于关系,若flag[i + 1][i] = true,说明前导字符已经满足字典序升序。否则需要对字符进行判断。注意对该列处理完之后,若保留该列,相邻行之间存在大于关系时需要对flag进行更新。
代码如下:
#include <cstdio>
using namespace std;
#define N 105
char a[N][N];
bool flag[N][N];
int main(){
int n, m;
scanf("%d %d", &n, &m);
for(int i = 0; i < n; ++i){
getchar();
scanf("%s", a[i]);
}
int ans = 0;
for(int i = 0; i < m; ++i){
bool rm = false;
for(int j = 1; j < n; ++j){
if(!flag[j][j - 1] && a[j][i] < a[j - 1][i]){
ans ++, rm = true;
break;
}
}
if(!rm){
for(int j = 1; j < n; ++j)
if(!flag[j][j - 1] && a[j][i] > a[j - 1][i])
flag[j][j - 1] = true;
}
}
printf("%d\n", ans);
return 0;
}