• *的字母的组合


    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

    给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。



    示例:

    输入:"23"
    输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

    方法一:

    解题思路:

    (1)首先建立一个映射关系表,将2-9之前的数字对应的字符串依依映射;

    (2)将已经找到的字母的组合与新的数字对应的字符串,进行组合,产生新的字母组合

    依次遍历直到键所有的数字都遍历完毕

    (3)其中需要对字符串为空,以及处理第一个字母的情况进行特殊的处理,其他的逻辑都是一致的。

    代码如下:

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

    char ** combinations(char ** string, char * ptr, int *num){
        char ** ret_string=NULL;
        int ii=0;

        if(*num==0 || string==NULL){ // 还没有产生任何字母组合,第一个数字的情况
            int ptr_len=strlen(ptr);
            ret_string=malloc(sizeof(char *)*ptr_len);
            for(;ii<ptr_len;ii++){
                ret_string[ii]=malloc(sizeof(char)*2);
                memset(ret_string[ii], 0, sizeof(char)*2);
                ret_string[ii][0]=ptr[ii];
            }
            *num=ptr_len;
            return ret_string;
        }
        
        int old_string_len=strlen(string[0]);
        int num_combination=strlen(ptr)*(*num);
        ret_string=malloc(sizeof(char *)*num_combination);
        int each_string_len=old_string_len+2;
        ii =0;
        for(;ii<num_combination;ii++){
            ret_string[ii]=malloc(each_string_len);
            memset(ret_string[ii], 0, each_string_len);
        }

        ii=0;
        int count=0;
        for(;ii<*num;ii++){

    // 将之前所有老的字母组合与新的字符串的每一个字符进行组合,产生新的排列组合
            char * tmp_ptr=ptr;
            while(*tmp_ptr!=''){
                memcpy(ret_string[count], string[ii], old_string_len);
                ret_string[count][old_string_len]=*tmp_ptr;
                count++;
                tmp_ptr++;    
            }
        }
    //释放之前的内存,将新的组合返回
        ii=0;
        for(;ii<*num; ii++){
            free(string[ii]);
        }
        free(string);
        *num=count;
        return ret_string;
        
    }

    char **letterCombinations(char *digits, int *returnSize){
        char *string[]={"","", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        char *tmp_string=NULL;
        char **ret_string=NULL;
        int count=0;
        int digits_len=strlen(digits);
        if(digits_len==0){

    // 为空直接返回
            *returnSize=0;
            return ret_string;
        }

        int ii=0;
        while(digits[ii]!=''){
            int num=digits[ii]-'0';
            char * ptr=string[num];
            ret_string=combinations(ret_string, ptr, &count);

    //调用接口,循环遍历每次都将之前的组合,新的字符串,之前的组合中有多少个可能作为参数传入,然后将新生成的组合与新组合中有多少种可能传出
            ii++;
        }

        *returnSize=count;
        return ret_string;

    }

    该算法的时间复杂度为O(3^N*4^M), 其中的N是对应字母为三个的数字的个数, M是对应字母为四个的数字的个数。



    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 相关阅读:
    springcloud中常用的注解
    MySQL--Profiling和Trace使用
    MySQL Execution Plan--IN查询计划
    MySQL Config--参数system_time_zone和参数time_zone
    MySQL Replication--全局参数gtid_executed和gtid_purged
    MySQL Transaction--事务无法正常回滚导致的异常
    MySQL Execution Plan--数据排序操作
    MySQL Session--批量KILL会话
    MySQL Transaction--MySQL与SQL Server在可重复读事务隔离级别上的差异
    MySQL Transaction--事务相关查询
  • 原文地址:https://www.cnblogs.com/pigdragon/p/12437470.html
Copyright © 2020-2023  润新知