【问题标题】:number of ways to decode a string?解码字符串的方法有多少?
【发布时间】:2019-03-04 04:00:01
【问题描述】:

我正在解决需要解码字符串的问题..

包含 A-Z 字母的消息正在被编码为数字 使用以下映射:

'A' -> 1

'B' -> 2

...

'Z' -> 26

给定一个仅包含数字的非空字符串,确定总数 解码方法的数量。

示例 1:

输入:“12”

输出:2

解释:它可以被解码为“AB”(1 2)或“L”(12)。

示例 2:

输入:“226”

输出:3

解释:可以解码为“BZ”(2 26)、“VF”(22 6)或“BBF”(2 2 6)。

我想出了下面的递归方法,但它为这个输入“227”提供了错误的输出。输出应该是“2”,但我的程序给出的是“3”:

  public static int decodeWays(String data) {
    return helper(data, data.length());
  }

  private static int helper(String data, int k) {
    if (k == 0)
      return 1;
    int s = data.length() - k;
    if (data.charAt(s) == '0')
      return 0;

    int result = helper(data, k - 1);
    if (k >= 2 && Integer.parseInt(data.substring(0, 2)) <= 26) {
      result += helper(data, k - 2);
    }
    return result;
  }

我上面的方法有什么问题?

【问题讨论】:

  • 2,2 和 7,而不是我假设的 22 和 7?
  • 我用示例编辑了我的问题。我的输入基本上有两种方式:2 2 722 7 但我的程序给了我 3 作为输出。
  • 如果k为0,为什么返回1?顺便问一下,为什么需要k

标签: java algorithm data-structures


【解决方案1】:

在这一行-

if (k >= 2 && Integer.parseInt(data.substring(0, 2)) <= 26) {

您总是检查相同的两位数字data.substring(0, 2)。而是考虑类似

data.substring(data.length()-k, data.length()).substring(0, 2)

data.substring(data.length()-k, data.length()-k+2)

【讨论】:

  • 不太明白..你能解释一下吗?
  • data 始终是 "227" 或任何输入。所以data.substring(0, 2) 总是产生22,它总是小于26,这就是为什么你要数3 而不是2。
  • 例如 367 怎么样?它应该返回 3,6 和 7,但是使用上面的代码,它只会检查 3?这应该工作: data.substring(data.length()-k, data.length()-k+1)
  • @MS90 我可能有一个错误,但即使这样我知道第二个索引必须比第一个大 2,因为子字符串不包括第二个索引。
  • 好的,但是在这种情况下呢:1212236 -> 12 21, 在这种情况下省略中间的 2? @狄龙戴维斯
猜你喜欢
  • 1970-01-01
  • 2012-11-06
  • 2011-08-22
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 2016-06-01
相关资源
最近更新 更多