题目是将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());