《leetCode-php》给一个数字字符串解密为字母字符串

本文介绍了一种使用动态规划解决数字解密问题的算法。通过将数字映射为字母,探讨了如何计算给定数字串的不同解密方式数量。以数字'121'为例,展示了算法的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一条仅包含字母‘A’-‘Z’的消息用下列的方式加密成数字 'A' -> 1↵'B' -> 2↵...↵'Z' -> 26

现在给出加密成数字的密文,请判断有多少种解密的方法。例如: 

给出的密文为“12”,可以解密为"AB"(1 2) 或者"L"(12).所以密文"12"的解密方法是2种.

思路:动态规划

最大的字母为26,所以最多用两位来构造一个字母。

D[i]为第i个位置的所有解密字符串。

D[i]= (D[i-1] . i解密出的字母) & (D[i - 2] . i-1和i两位一起解密出的字母)

<?php
function numDecodings($s) {
    $arrMap = [
        'A' => 1,
        'B' => 2,
        'C' => 3,
        'D' => 4,
        'E' => 5,
        'F' => 6,
        'G' => 7,
        'H' => 8,
        'I' => 9,
        'J' => 10,
        'K' => 11,
        'L' => 12,
        'M' => 13,
        'N' => 14,
        'O' => 15,
        'P' => 16,
        'Q' => 17,
        'R' => 18,
        'S' => 19,
        'T' => 20,
        'U' => 21,
        'V' => 22,
        'W' => 23,
        'X' => 24,
        'Y' => 25,
        'Z' => 26
    ];
    $arrNewMap = array_flip($arrMap);
    $num = strlen($s);
    $D[-1] = [];
    for ($i = 0; $i < $num; $i ++) {
        if ($i == 0) {
            $D[$i] = [$arrNewMap[$s[$i]]];
        }
        foreach ($D[$i - 1] as $item) {
            $D[$i][] = $item . $arrNewMap[$s[$i]];
        }
        if (intval($s[$i-1] . $s[$i]) <= 26) {
            if ($i == 1) {
                $D[$i][] = $arrNewMap[$s[$i-1] . $s[$i]];
            }
            foreach ($D[$i - 2] as $item) {
                $D[$i][] = $item . $arrNewMap[$s[$i-1] . $s[$i]];
            }
        }
    }
    print_r($D[$num - 1]);
}
$s = '121';
numDecodings($s);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值