题目描述::
比较字符串大小,但比较的规则不同字典序规则。字符比较新规则如下:A < a < B < b < ………… < Z < z。
输入:
输入数据包含多个测试实例,每个测试实例占两行,每一行有一个字符串(只包含大小写字母, 长度小于10000)。
输出:
如果第一个字符串小于第二个,输出YES,否则,输出NO。
注意:A < a < B < b < ………… < Z < z。
样例输入 :
abc Bbc Ab a ABcef ABce
样例输出 :
YES YES NO
问题分析:
Z此问题主要在于如何将大小写字母按照A<a<B<b<……<Z<z,我们对每一个字符进行转化大写字母用奇数表示,小写字母用偶数表示,这样就将字符Aa....按照如上顺序表示出来了,这个顺序用1,3,5,7......分别表示对应的A,B,C,D......用2,4,6,8......表示了a,b,c,d......这样一来只需要将对应的字符转化为对应数字即可,而这个转化很容易实现:大写字母进行如下操作,
ch[i]=2*(ch[i]-'A'+1)-1;
小写字母进行如下操作:
ch[i]=2*(ch[i]-'a'+1)
这样就将每一个字符的相对大小表示出来了,然后直接按每一位比较即可。
比较过程的实现:令i=0如果第一个字符串的的c1[i]不等于\0说明字符串的还没结束进入循环,先判断c2[i]是否等于\0,如果等于说明字符串c2已经结束,如果不等于说明c2也没结束可以比较,如果c1[i]小于c2[i]说明已经分辩出来,打印YES同时跳出循环;如果c1[i]等于c2[i]说明在这一位并未分辨出字符串之间的大小关系,进行i++进入下一次循环比较下一位;如果c1[i]大于c2[i],打印NO同时跳出循环,这样就可以分辨出字符串c1与字符串c2之间的大小关系。如图:
代码实现
#include<stdio.h>
#include<string.h>
int main(){char c1[10001],c2[10001];int flag=0;while((scanf("%s",c1))!=EOF,(scanf("%s",c2))!=EOF){int x=0;while(c1[x]!='\0'){if(c1[x]>='A'&&c1[x]<='Z'){c1[x]=2*(c1[x]-'A'+1)-1;}else{c1[x]=2*(c1[x]-'a'+1);}x++;}x=0;while(c2[x]!='\0'){if(c2[x]>='A'&&c2[x]<='Z'){c2[x]=2*(c2[x]-'A'+1)-1;}else{c2[x]=2*(c2[x]-'a'+1);}x++;}int i=0;while(c1[i]!='\0'){if(c2[i]!='\0'){if(c1[i]>c2[i]){printf("NO\n");break;}else if(c1[i]<c2[i]){printf("YES\n");break;}else if(c1[i]==c2[i]){i++;}}else{printf("NO\n");break;}} if(c2[i]=='\0'&&i==strlen(c1)){printf("NO\n");}else if(c2[i]!='\0'&&i==strlen(c1)){printf("YES\n");}}return 0;
}
运行结果:
提交结果: