500. Keyboard Row - 是否为键盘行序列

hhttps://leetcode.com/problems/keyboard-row/

分析

判断所给的各个序列是否是有键盘中的一行字母能够组成的,写的比较简单,也没用什么算法,简单的字符串匹配加判断,没有拆分封装函数,写的比较啰嗦,还用了goto,有下面几点需要关注:

  1. goto语句后面不能直接结束,至少还需要有一条语句,否则会报错
  2. 动态二维数组内存申请,先申请行指针,再申请列内存

实现

/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
char** findWords(char** words, int wordsSize, int* returnSize) {
    int *pYesWordNum;
    int yesWordCount = 0;
    int i = 0;
    int j = 0;
    int k = 0;
    int line1Flag = 0;
    int line2Flag = 0;
    int line3Flag = 0;
    int wordLen = 0;
    int maxWordLen = 0;
    int retWordNum = 0;
    char line1[20] = {'q','w','e','r','t','y','u','i','o','p','Q','W','E','R','T','Y','U','I','O','P'};
    char line2[18] = {'a','s','d','f','g','h','j','k','l','A','S','D','F','G','H','J','K','L'};
    char line3[14] = {'z','x','c','v','b','n','m','Z','X','C','V','B','N','M'};
    char **pRetWords;
    int pp;

    pYesWordNum = (int *)malloc(wordsSize * sizeof(int));
    memset(pYesWordNum, 0, wordsSize * sizeof(int));

    for (i = 0; i < wordsSize; i++)
    {
        wordLen = (int)strlen(words[i]);
        if (wordLen > maxWordLen)
        {
            maxWordLen = wordLen;
        }

        line1Flag = 0;
        line2Flag = 0;
        line3Flag = 0;

        for (j = 0; j < wordLen; j++)
        {
            for (k = 0; k < 20; k++)
            {
                if (words[i][j] == line1[k])
                {
                    if ((line2Flag == 1) || (line3Flag == 1))
                    {
                        goto nextWord;
                    }
                    line1Flag = 1;
                    goto nextAlphabet;
                }
            }

            for (k = 0; k < 18; k++)
            {
                if (words[i][j] == line2[k])
                {
                    if ((line1Flag == 1) || (line3Flag == 1))
                    {
                        goto nextWord;
                    }
                    line2Flag = 1;
                    goto nextAlphabet;
                }
            }

            for (k = 0; k < 14; k++)
            {
                if (words[i][j] == line3[k])
                {
                    if ((line1Flag == 1) || (line2Flag == 1))
                    {
                        goto nextWord;
                    }
                    line3Flag = 1;
                    goto nextAlphabet;
                }
            }

            /* 该单词已检查,跳转下一个字母 */
            nextAlphabet:

            pp =1;
        }


        /* 该单词符合,进行记录 */
        pYesWordNum[i] = 1;

        /* 该单词不符合,跳转下一个单词 */
        nextWord:

        pp =1;
    }

    /* 统计符合单词的数目 */
    for (i = 0; i < wordsSize; i++)
    {
        if (pYesWordNum[i] == 1)
        {
            yesWordCount++;
        }
    }

    pRetWords = (char **)malloc(yesWordCount * sizeof(char *));
    for (i = 0; i < yesWordCount; i++) 
    {
        pRetWords[i]=(char *)malloc(maxWordLen);
    }

    for (i = 0; i < yesWordCount; i++)
    {
        memset(pRetWords[i], 0, maxWordLen);
    }

    for (i = 0; i < wordsSize; i++)
    {
        if (pYesWordNum[i] == 1)
        {
            strcpy(pRetWords[retWordNum], words[i]);
            retWordNum++;
        }
    }

    free(pYesWordNum);

    *returnSize = retWordNum;
    return pRetWords;
}

猜你喜欢

转载自blog.csdn.net/qq_25077833/article/details/54920560