帮帮同学在设计一个文字碰碰消游戏,规定"五"和"八"形成"五八"组合碰到一起即会消除,("八五" 不会消除)。
例如 "五八", "五八五八", "五五八八"。说明: "五五八八" 是内层的"五八"碰在一起消除后,外层的"五八"会碰在一起消除。
帮帮同学想知道n个"五"和"八"组成的字符串中,有多少种组合可以满足消除为空字符串。
现为帮帮同学设计一个方法,输入整数n,表示"五"和"八"的数量,返回n个"五"和n个"八"组成的字符串中,满足消除为空字符串的组合数。
帮帮同学在设计一个文字碰碰消游戏,规定"五"和"八"形成"五八"组合碰到一起即会消除,("八五" 不会消除)。
例如 "五八", "五八五八", "五五八八"。说明: "五五八八" 是内层的"五八"碰在一起消除后,外层的"五八"会碰在一起消除。
帮帮同学想知道n个"五"和"八"组成的字符串中,有多少种组合可以满足消除为空字符串。
2
2
满足的组合 [ '五五八八', '五八五八' ]
3
5
满足的组合 [ '五五五八八八', '五五八五八八', '五五八八五八', '五八五五八八', '五八五八五八' ]
"五五八八" 是内层的"五八"碰在一起消除后,外层的"五八"会碰在一起消除。
// 参考:**的22-括号生成
// 思路:使用回溯记录数量,五看成左括号,八看成右括号
// 不符合的条件的直接剪枝
/**
* 输入整数n,返回可消除为空字符串的的n组"五八"字符串数量。
* @param n int整型
* @return int整型
*/
function getTargetNumber(n) {
let res = 0;
backtracing(n, n);
return res;
function backtracing(fi, ei) {
if (fi == 0 && ei == 0) {
res++;
return;
}
if (fi > 0) {
backtracing(fi - 1, ei);
}
// 保证八比五少
if (ei > fi) {
backtracing(fi, ei - 1);
}
}
}
module.exports = {
getTargetNumber: getTargetNumber,
}; function getTargetNumber(n) {
//对外封装只保留可传入参数n
function nsum(x, n) {
//n为层数,累加开始的底数,x为顶数,由上层递归累加过程中传入
if (n === 0)
return 1
//如果层数为0,则返回1作为递归终点
var s = 0
for (var i = n; i <= x; i++) {
s = s + nsum(i, n - 1)
}
return s
}
return nsum(n, n)
}