提交leetcode的时候遇到了问题,一直说访问越界,但仔仔细细检查n多遍,就是检查不出来。

因为我用到了count全局变量,自加一来表明当前数组访问的位置,

后来突然想到,是不是在leetcode在运行测试用例的时候,是连续测试的,用的同一个上下文,这样的话,就没有对这个全局变量清零……

果然,清零之后就可以了……已经3:47了,这里先上代码,明天再详细说吧……


今天更新一下这道题的思路。

可以先参考一下之前的两篇文章,循序渐进,好理解一些:

leadcode的Hot100系列--78. 子集--位运算

leadcode的Hot100系列--78. 子集--回溯

子集--回溯 的文章里面,介绍了一下数字的排列组合,用01来表示对应的数字是否存在。

如果我们还是按照这个思路,但是换一个想法呢?

0、1是不是本身就可以代表着字符串?

对应排列出来的000\001\010 ... 是不是就是相当于:

我需要一个数字组合,组合需要三位数,每一位的数字要么是0,要么是1

这么一想,是不是就与题目一致了:

我需要一个字母组合,组合的位数就是输入的字符串长度,每一位的字母是对应的几个字母中的某一个

对,就是这么想的,比如,输入“89”,就说明,字母组合的位数是两位,第一位字母是'tuv'里面的一个,第二位字母是'wxyz'里面的一个。

这里再看下之前上一篇中回溯的代码:

void backtrack (int t)
{
if (t == level)
show();
else
for (int i=0;i<=1;i++)
{
y[t]=i;
backtrack(t+1);
}
}

重点来了!!!!

  • 第三行的level表示层数,也就是遍历的深度,也就是组合所需要的位数,当需要两位字母的时候,就只要两层。
  • 第六行的for循环,表示了每一层的选项,之前因为只需要表示存在和不存在,所以只需要用0和1就够了,但在这里,是由数字对应的字符串的某一个,例如如果数字是8,则对应的选项就是't'和'u'和'v'。

所以,当输入为“89”的时候,就可以生成这样一种树:

控制了树的层数和树的分支(分支就是可选项)之后,就可以完成所有组合。

char table[][5] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
char level = 0;
char *p[8]; // 指向数字对应的字符串,例如,当输入数字为"89"时,p[0]为"tuv",p[1]为"wxyz"。
char len[8]; // 对应上面p存储的字符串的长度,例如,当输入数字为"89"是,len[0]=3,len[1]=4。
char **out; //二维数组,是最终输出
int count = 0; // 用来记录当前已经生成了几个组合,对应着out数组的行坐标
char y[8] = {0}; // 记录每一次的组合结果 void backtrack(int level_now)
{
if (level_now == level)
{
memcpy(out[count], y, level); // 把这次组合结果拷贝到out数组中。这里为什么需要用一个y数组来记录组合结果,然后拷贝到out中呢?大家可以自己想一想
count ++; // 完成一个字符串
return;
}
for (int i=0; i<len[level_now]; i++)
{
y[level_now] = p[level_now][i];
backtrack(level_now+1);
}
return;
} char ** letterCombinations(char * digits, int* returnSize){
level = strlen(digits); // 遍历的层数
*returnSize = 0;
if (0 == level) return NULL; *returnSize = 1; for(int i=0; i<level; i++)
{
p[i] = table[digits[i]-'0']; // 对p数组进行赋值
len[i] = strlen(p[i]);
if (len[i] == 0)
{
*returnSize = 0;
return NULL;
}
*returnSize *= len[i]; // 计算总共有多少个组合
}
out = (char **)calloc(*returnSize, sizeof(char *)); // 先分配行指针
if (NULL == out) return NULL;
for (int i=0; i<*returnSize; i++)
{
out[i] = (char *)calloc(1, sizeof(char) * (level+1)); // 再分配每个行指针的内容,因为字符串后面需要一个结束符'\0',所以这里需要level+1
if (NULL == out[i]) return NULL;
}
backtrack(0);
count = 0; // 这里很重要!很重要!!很重要!!!
return out;
}

leadcode的Hot100系列--17. 电话号码的字母组合--回溯的另一种想法的应用的更多相关文章

  1. [LeetCode] 17. 电话号码的字母组合 ☆☆☆(回溯) ###

    描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23"输出:[&q ...

  2. [LeetCode] 17. 电话号码的字母组合(回溯)

    题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[& ...

  3. leadcode的Hot100系列--64. 最小路径和--权值最小的动态规划

    如果这个: leadcode的Hot100系列--62. 不同路径--简单的动态规划 看懂的话,那这题基本上是一样的, 不同点在于: 1.这里每条路径相当于多了一个权值 2.结论不再固定,而是要比较不 ...

  4. Leetcode之回溯法专题-17. 电话号码的字母组合(Letter Combinations of a Phone Number)

    [Leetcode]17. 电话号码的字母组合(Letter Combinations of a Phone Number) 题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组 ...

  5. Java实现 LeetCode 17 电话号码的字母组合

    17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23& ...

  6. leetcode(js)算法之17电话号码的字母组合

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母 示例: 输入:"23" 输出:[" ...

  7. [LeetCode] 17. 电话号码的字母组合

    题目描述:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/ 题目描述: 给定一个仅包含数字 2-9 的字符 ...

  8. Leetcode题库——17.电话号码的字母组合

    @author: ZZQ @software: PyCharm @file: letterCombinations.py @time: 2018/10/18 18:33 要求:给定一个仅包含数字 2- ...

  9. leetcode题目17.电话号码的字母组合(中等)

    题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23"输出: ...

随机推荐

  1. get与post一些特殊情况下

    p=574"> 文章已经迁移至http://androiddevelop.cn/?p=574 版权声明:本文博客原创文章.博客,未经同意,不得转载.

  2. EF相关报错

    EF7无法找寻依赖问题解决方案 现象:使用EF7的过程中,任何"dnx . XXX"的都会报错,提示"cannot resolve dependencies for ta ...

  3. XF 显示网络图像

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. 在IOS开发中使用GoogleMaps SDK

    一.申请一个免费的API KEY要使用GoogleMaps SDK,必须要为你的应用申请一个API KEY,API Key可以让你监视你的应用调用api的情况.api key是免费的,你可以在任何调用 ...

  5. 通通WPF随笔(1)——基于lucene.NET让ComboBox拥有强大的下拉联想功能

    原文:通通WPF随笔(1)--基于lucene.NET让ComboBox拥有强大的下拉联想功能 我一直很疑惑百度.谷哥搜索框的下拉联想功能是怎么实现的?是不断地查询数据库吗?其实到现在我也不知道,他们 ...

  6. javascript高程笔记-------第四章 变量、作用域和内存问题

    首先JavaScript中的变量分为基本类型和引用类型. 基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象. 1.参数传递 javascript中所有参数的传递都是值传 ...

  7. WMWaire使用FreeNAS硬盘挂载、Raid0

    FreeNAS硬盘挂载.Raid0 发表于2012 年 03 月 28 日由admin 创建成功,FreeBSD的Hardware显示状态 今天,我们将在VMware工具的帮助下,学习“FreeNAS ...

  8. IE的BHO通过IHTMLDocument2接口获得网页源代码

    参考了凤之焚的专栏:http://blog.csdn.net/lion_wing/article/details/769742 但是他的源码有些问题,即IHTMLElementCollection接口 ...

  9. SQLServer 订阅过期解决方法

    原文:SQLServer 订阅过期解决方法 由于分发数据库执行一个较长的事务,达到了系统预定的72小时,导致了该订阅过期,数据库分发代理已不可再启用,提示错误如下: 错误信息:已将此(这些)订阅标记为 ...

  10. UWP开发-获取设备唯一ID

    EasClientDeviceInformation deviceInfo = new EasClientDeviceInformation(); this.showDeviceInfo.Items. ...