题目:
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
你可以按任意顺序返回答案。
示例 1:
输入:["bella","label","roller"]
输出:["e","l","l"]
示例 2:
输入:["cool","lock","cook"]
输出:["c","o"]
提示:
1 <= A.length <= 100
1 <= A[i].length <= 100
A[i][j] 是小写字母
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-common-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
结果:
解题思路:
1,首先既然是每个单词中都存在的字母,那么循环次数肯定小于第一个。并且只需要确定第一个单词的字母哪些是别的单子都有的就可以了。
2,对第一个单词循环的时候为了判断相同字母的个数,最好对第一个单词进行排序,这样可以明确相同字母的个数,在后面单词的循环中,只需要把该字母在每个单词中都存在的数量输出就可以了。
代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int compar (const void *a, const void *b)
{
return *(char *)a - *(char *)b;
}
char ** commonChars(char ** A, int ASize, int* returnSize){
int len = strlen(A[0]);
int i ,j, n, count, temp, tempLen;
char tempA[101] = {}; //用于存放第一个单词
char retTemp[101] = {};//用于存放共有字母数量,等确定数量后再去堆中申请空间,减少空间的浪费。
*returnSize = 0;
strcpy(tempA, A[0]);
qsort(tempA, len, sizeof(char), compar);
for(i = 0; i < len; ) {
//找出第一个单词中与tempA[i]相同的字符有多少个
count = 1;
for(j = i + 1; j < len; j++) {
if(tempA[j] == tempA[i]) {
count++;
} else {
break;
}
}
//循环查找后面单词中该字母出现的次数
for(j = 1; j < ASize; j++) {
temp = 0;
tempLen = strlen(A[j]);
for(n = 0; n < tempLen; n++) {
if(A[j][n] == tempA[i]) {
temp++;
}
if(temp == count) {
break;
}
}
/如果当前单词中该字母数量不满足count,那么这个字母最多可能存在的数量就变成temp
count = temp < count ? temp : count;
if(count == 0) {
break;
}
}
for(n = 0; n < count; n++) {
retTemp[*returnSize] = tempA[i];
*returnSize += 1;
}
for(i += 1;i < len && tempA[i] == tempA[i-1]; i++);
}
char **retarr = (char **)malloc(sizeof(char *) * (*returnSize));
for(i = 0; i < *returnSize; i++) {
retarr[i] = (char *)malloc(sizeof(char) * 2);
retarr[i][0] = retTemp[i];
retarr[i][1] = '\0';
}
return retarr;
}