leetcode 17. 電話號碼的字母組合

題目描述

https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/

思路整理

看到這個題,想法的算法就是枚舉,枚舉的實現也有也有多種方式??梢圆捎醚h(huán),也可以采用遞歸。
但是這道題首先要解決的是內存的問題,如何“一次性”申請一個合適大小的內存。因為C語言不具備動態(tài)申請內存的條件。如果采用C++ vector,多次創(chuàng)建string對象+容器操作,內存的復雜度會減小一點。本題可以考慮優(yōu)先構建號碼簿二維數組,再基于輸入的數字串計算出存儲結果的二維數組的大小。
其次要解決的問題,就是如果循環(huán)的問題,大體思路還是先循環(huán)輸入的字符串,對每一個數字所對應全部字母按樹形結構輪詢。
方案一:看到樹形結構,通常會優(yōu)先考慮采用遞歸的方式。
方案二:將該問題轉化為一個二維數組填值的問題,通過處理行和列的序列關系,分別對二維數組按行填值,這樣可以避免遞歸,直接用兩個for循環(huán)解決。
方案1是我想的,給出代碼,方案二是別人想的,我給出鏈接。

代碼show

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *letter_matrix[10];
int letter_length[10];

void gettable(char **letters,int *letters_index,char *digits,int offset,char *record,int record_offset)
{
    int i = 0;
    int loop = 0;
    if(digits[offset] == 0)
    {
        memcpy(letters[*letters_index],record,record_offset);
        *letters_index = *letters_index + 1;
        return;
    }
    int index = digits[offset] - '0';
    if (letter_length[index] > 0) {
            loop = letter_length[index];
    }
    for(i = 0;i < loop;i++)
    {
        record[record_offset] = letter_matrix[index][i];
        gettable(letters,letters_index,digits, offset + 1, record, record_offset + 1);
    }
}

/**
 ** Return an array of size *r eturnSize.
 ** Note: The returned array must be malloced, assume caller calls free().
 **/
static char** letterCombinations(char* digits, int* returnSize)
{
    letter_matrix[0] = "";
    letter_matrix[1] = " ";
    letter_matrix[2] = "abc";
    letter_matrix[3] = "def";
    letter_matrix[4] = "ghi";
    letter_matrix[5] = "jkl";
    letter_matrix[6] = "mno";
    letter_matrix[7] = "pqrs";
    letter_matrix[8] = "tuv";
    letter_matrix[9] = "wxyz";
    
    letter_length[0] = 0;
    letter_length[1] = 1;
    letter_length[2] = 3;
    letter_length[3] = 3;
    letter_length[4] = 3;
    letter_length[5] = 3;
    letter_length[6] = 3;
    letter_length[7] = 4;
    letter_length[8] = 3;
    letter_length[9] = 4;
    int i, j, k;
    int empty = 1;
    int count = 1;
    int digit_len = strlen(digits);
    for (i = 0; i < digit_len; i++) {
        int index = digits[i] - '0';
        if (letter_length[index] > 0) {
            empty = 0;
            count *= letter_length[index];
        }
    }

    if (empty) {
    *returnSize = 0;
        return NULL;
    }

    *returnSize = count;

    char **letters = malloc(sizeof(char *) * count);
    for (i = 0; i < count; i++) {
        letters[i] = malloc(digit_len + 1);
        memset(letters[i], 0, digit_len + 1);
    }
    char record[10] = {0};
    int letters_index=0;
    gettable(letters,&letters_index,digits,0,record,0);

    return letters;
}

int main(int argc, char **argv) {
    int i, size = 0;
    char test[10] = "249";
    char ** letters = letterCombinations(test, &size);
    for (i = 0; i < size; i++) {
        printf("%s\n", letters[i]);
        free(letters[i]);
    }
    free(letters);
    return 0;
}

方案二:
https://github.com/crazy-shawn-liu/leetcode/tree/master/051_n_queens

總結

1.確定初始二維數組的大小及布局。
2.確定遍歷得到數組值的方法。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 題目鏈接:https://leetcode-cn.com/problems/letter-combinations...
    haha2333閱讀 317評論 0 0
  • 給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。給出數字到字母的映射如下(與電話按鍵相同)。注意...
    LeeYunFeng閱讀 1,044評論 0 48
  • 題目描述 給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。 給出數字到字母的映射如下(與電話按鍵...
    河海中最菜閱讀 211評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,658評論 1 32
  • 早晨分享:[玫瑰][玫瑰] 教育首先需要意識到: 孩子是教育的主體,孩子是自己學業(yè)的主人,家庭和學校環(huán)境雖然對孩子...
    y詩淇閱讀 103評論 0 0

友情鏈接更多精彩內容