字母的组合【动态规划与递归】

题目是将1-26个字母排序 输入数字 返回能够组成的字母组合总数 答案未经严格验证!!


let s = "1011231654615131010";


let arr = s.split("");
let total = 0,
  l = arr.length;
function name(tarr = [], p = 0) {
  if (p >= l) {
    if (
      !tarr.find(
        (e) => Number(e) > 26 || (e.length > 1 && Number(e) < 9) || e == 0
      )
    ) {
      total += 1;
    }

    return;
  }
  const t1 = arr[p],
    t2 = arr[p + 1];
  if (t1) {
    name(tarr.concat([t1]), p + 1);
  }
  if (t2) {
    name(tarr.concat([t1 + t2]), p + 2);
  }
}
name();
//
console.log(total);

function name1(params) {
  let sl = s.length;
  let dp = new Array(sl).fill(0);
  dp[0] = s.charAt(0) == 0 ? 0 : 1;
  if (dp[0] == 0 || dp.length === 1) return dp[0];
  if (s.substring(0, 2) < 27 && s.substring(0, 2) > 10) {
    dp[1] = 2;
  } else if (s.charAt(1) == 0 && s.charAt(0) > 2) {
    return 0;
  } else {
    dp[1] = 1;
  }

  for (let i = 2; i <sl; i++) {
    const ts = s.substring(i - 1, i + 1);
    if (ts <= 26 && ts >= 10 ) {
      if (ts.charAt(1) == 0) {
        dp[i] = dp[i - 2];
      } else {
        dp[i] = dp[i - 2] + dp[i - 1];
      }
    } else if (ts == 0 || (ts.charAt(1) == 0 && ts.charAt(0) > 2)) {
      return 0;
    } else  {
      dp[i] = dp[i - 1];
    }
  }
  console.log(dp);

  return dp[dp.length - 1];
}
console.log(name1());


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值