用两个长度为26的数组分别记录两个数组中各个字母出现的次数,最后进行比较,出现不一样的即可判结。
int isCongruent(char* s, char* c){ int n1 = strlen(s), n2 = strlen(c); if(n1 != n2) return -1; //长度不一样的两个字符串肯定不是异位 int i = 0; int count1[26] ={0}; int count2[26] ={0}; for(i = 0; i<n1; i++) count1[s[i] - 'a']++; //字符减字符,其实是ASCII码相减,即为字母间距 //即count1[0]记录a出现次数,count1[1]记录b出现次数,依此类推 for(i = 0; i<n2; i++) count2[c[i] - 'a']++; for(i = 0; i< 26; i++){ if(count1[i] != count2[i]){ //只要出现不相等的,即可判结 return -1; break; } } return n1; }或者只用一个数组,第一个字符串数字母时用正计数,第二个字符串数字母时在第一组计数的基础上负计数,最后从头遍历,不=0的就是两个字符串中出现次数不同的字母。
int isCongruent(char* s, char* c){ int n1 = strlen(s), n2 = strlen(c); if(n1 != n2) return -1; int i = 0; int count[26] = {0}; for(i = 0; i<n1; i++) count[s[i] - 'a']++; //正计数 for(i = 0; i<n2; i++) count[c[i] - 'a']--; //负计数 for(i = 0; i< 26; i++){ if(count[i] != 0){ return -1; break; } } return n1; }