LeetCode | Letter Combinations of a Phone Number(号码的字符串组合)


Given a digit string, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below.

《LeetCode | Letter Combinations of a Phone Number(号码的字符串组合)》

Input:Digit string "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.

题目解析:

题目比较简单,就是将所有组合情况排列出来即可。但是实现的时候也是遇到不小的难度。

输出数组buf的下标问题,只能借助于给函数传递参数来实现。

但是更简单的方法是:设置一个堆栈,深层次遍历的时候,向里面放入数据,退出一个层次的时候,弹出数据。这样就很好解决了数组下标的问题。

再深层次考虑:通过网上查看相关代码,很多人提到了DFS。这是深度优先搜索。

深度优先遍历图的方法是,从图中某顶点v出发:
(1)访问顶点v;
(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

虽然看过了很多算法,提到了也能知道其中的含义,但是不会用到实际的问题当中。从这点看,能力还有待提高!

方案一:常规方法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
char *arr[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
char buf[MAX];
void LetterOfPhoneNumber(char *str,int index);

int main()
{
    char str[MAX];
    int n;

    while(scanf("%s",str) != EOF){
        n = strlen(str);
        buf[n] = '\0';
        LetterOfPhoneNumber(str,0);
    }
    return 0;
}

void LetterOfPhoneNumber(char *str,int index)
{
    if(*str == '\0'){
        puts(buf);
        return;
    }

    if(*str<'2' || *str > '9'){
        printf("invalid number!\n");
        exit(1);
    }
    if(*str == '7' || *str == '9'){
        for(int i = 0;i < 4;++i){
            buf[index] = arr[*str - '0'][i];
            LetterOfPhoneNumber(str+1,index+1);
        }
    }else{
        for(int i = 0;i < 3;++i){
            buf[index] = arr[*str - '0'][i];
            LetterOfPhoneNumber(str+1,index+1);
        }
    }
}


方案二:深度优先搜索

DFSTraverse:判断不合法输入,并初始化变量。

DFS:深度优先算法,定义字符串,遍历的第v个字符,以及栈的指针。


void DFSTraverse(char *str)
{
    if(str == NULL) //临界情况判断
        return;

    SqStack S;  //定义栈
    S.top = 0;

    DFS(str,0,&S);
}

void DFS(char *str,int v,SqStack *S)
{
    if(str[v] == '\0'){     //如果碰到了空字符,就将已经存放好的字符串输出,但输出前要定义结束符
        S->sarr[S->top] = '\0';
        puts(S->sarr);
        return ;
    }
    if(str[v] < '2' || str[v] > '9'){   //出现不合适的字符就报错并退出
        printf("invalid number\n");
        exit(1);
    }
    int numlen = strlen(arr[str[v] - '0']); //找到第i个字符串的字符长度

    for(int i = 0;i < numlen;++i){
        S->sarr[S->top++] = arr[str[v] - '0'][i];   //入栈
        DFS(str,v+1,S);                             //深度遍历
        S->top--;                                   //出栈
    }
}


推荐链接:http://blog.csdn.net/littlestream9527/article/details/17206179

点赞