bool IsEqual(char *str)
{
int len = strlen(str);
int map[26];
int same;
memset(map, 0, 26 * sizeof(int));
for (int i = 0; i < strlen(str); i++) {
map[str[i] - 'a']++;
same = map[str[i] - 'a'];
}
for (int i = 0; i < 26; i++) {
if (map[i] == 0) continue;
if (same != map[i]) {
return false;
}
}
return true;
}
bool equalFrequency(char * word){
int len = strlen(word);
char wordMv[len + 1];
bool isEqual = false;
for (int i = 0; i < len; i++) {
strcpy(wordMv, word);
strcpy(wordMv + i, word + i + 1);
wordMv[len] = '\0';
if (IsEqual(wordMv)) {
return true;
}
}
return false;
}
掉坑史:
- strcpy不能字符串自己进行复制搬移,如 strcpy(wordMv + i, wordWv + i + 1);
- memset(map, 0, 26 * sizeof(int)); 因为 memset 是按字节赋值的,所以 如果目的是字符串,只写要赋值的字符个数,别的大于一个字节的数据类型,要计算总共的字节数,如:memset(str, 0, 26); 不能 memset(map, 0, 26);
- bool IsEqual(char *str) 第二个 for 循环比较是否相同频率时,比较的 same 可以是非0 的任何一个,只要有不一样的,必定出现了不同频率的字母,不符题意返回false。在做的时候,没注意到这一点,same 初始化为 map[0] 而忘记了可能map[0]为0. 且比较频率的时候也忘记了0的处理,导致非0值和0值做了不必要的比较,扰乱输出结果。
别人的优秀解法:用 max = min 表达了“频率相同”;
static bool removeOne(char* s, int idx) {
int set[26] = {0};
int size = strlen(s);
int minf = size;
int maxf = 0;
for (int i = 0; i < size; i++) {
if (i == idx) {
continue;
}
set[s[i]-'a']++;
}
for (int i = 0; i < 26; i++) {
if (set[i]) {
if (set[i] < minf) {
minf = set[i];
}
if (set[i] > maxf) {
maxf = set[i];
}
}
}
return maxf == minf;
}
bool equalFrequency(char * word){
for (int i = 0, size = strlen(word); i < size; i++) {
if (removeOne(word, i)) {
return true;
}
}
return false;
}
作者:bx0216
链接:https://leetcode.cn/problems/remove-letter-to-equalize-frequency/solutions/2010429/by-bx0216-qcuz/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。