英雄算法联盟第二天字符串

 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值