题解 | #字母异位词的长度#
字母异位词的长度
http://www.nowcoder.com/practice/59426f49136349b0901cc1b70447bf4b
用两个长度为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;
}
