leet code 500
这一题我用一个数组将每一个字母所在的行标记上去,并且将每一个字母映射为数字,进行遍历,同时,破解了我对strlen的使用疑惑,此处应该强制类型转换为int型,不然leetcode会报错
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
char ** findWords(char ** words, int wordsSize, int* returnSize){
*returnSize = 0;
char **s = (char **)malloc(wordsSize * sizeof (char *));
int a[26] = {2,3,3,2,1,2,2,2,1,2,2,2,3,3,1,1,1,1,2,1,1,3,1,3,1,3};
int arr[4] = {0},k = 0;
for (int i = 0; i < wordsSize; ++i)
{
int sum = 0;
for (int j = 0; words[i][j]; ++j)
{
if (words[i][j] <= 'Z' && words[i][j] >= 'A')
arr[a[(int)(words[i][j] - 'A')]]++;
else if (words[i][j] <= 'z' && words[i][j] >= 'a')
arr[a[(int)(words[i][j] - 'a')]]++;
}
for (int j = 1; j < 4; ++j)
if (arr[j] > 0)
{
arr[j] = 0;
sum++;
}
if (sum == 1)
{
*(s + k) = (char *)malloc((int)(strlen(words[i]) + 1)*sizeof(char));
strcpy(*(s + k),words[i]);
k++;
}
}
*returnSize = k;
return s;
}
leet code 1160
我也是用和第一题一样的方法,映射字符串chars对应字符到arr上,便于查找和统计,此题只需要判断arr上对应的元素是否为0即可。
int countCharacters(char ** words, int wordsSize, char * chars){
int arr[26] = {0};
int sum = 0;
for (int i = 0; i < wordsSize; ++i)
{
int num = 0;
for (int i = 0; i < strlen(chars); ++i)
arr[(int)(chars[i] - 'a')] = 0;
for (int i = 0; i < strlen(chars); ++i)
arr[(int)(chars[i] - 'a')]++;
for (int j = 0; words[i][j]; ++j)
{
if (arr[(int)(words[i][j] - 'a')] > 0)
{
arr[(int)(words[i][j] - 'a')]--;
num++;
}
else
{
num = 0;
break;
}
}
sum += num;
}
return sum;
}
leet code 1047
此题为模拟栈(FILO)先进后出,类似判断回文数,我在做题过程中,在第一个条件判断时遇到问题,忽略了 && 先判断前一个条件,而我的head初始化为 -1 因此,会越界,所以,我将 head 的判断放到前方。
char * removeDuplicates(char * s){
int n = strlen(s);
char *stack = (char *)malloc((n + 1)*sizeof(char));
int head = -1;
for (int i = 0; i < n; ++i)
{
if (head >= 0 && stack[head] == s[i])
{
head--;
}
else
{
stack[++head] = s[i];
}
}
stack[++head] = '\0';
return stack;
}
leet code 1935
该题我也是用映射的方法,将 brokenLetters 映射到 arr 上,因此在遍历 text 时,只需要判断映射后的位置是否为 0 即可。在最后需要进行特判,因为当 i = n - 1 时,后方无空格了, 且 该位置不可以在 判断是否为0 前方, 因为此时 flag 仍然为 1;
int canBeTypedWords(char * text, char * brokenLetters){
int sum = 0,arr[26] = {0},flag = 1,n = strlen(text);
for (int i = 0; brokenLetters[i]; ++i)
arr[(int)(brokenLetters[i] - 'a')] = 1;
for (int i = 0; text[i]; ++i)
{
if (text[i] == ' ')
{
if (flag == 1)
sum++;
else flag = 1;
}
else if (arr[(int)(text[i] - 'a')] != 0)
flag = 0;
if (i == n - 1 && flag == 1)
sum++;
}
return sum;
}