1 回答
TA贡献1780条经验 获得超5个赞
花了点时间写个递归,用到了一个剪枝逻辑,如果一个字母只出现过1次,那么将对应的字母对从原始数据中剔掉。
let map = {}; // 计算字母出现次数使用
let result = [];
// 计算字母出现次数
arr.forEach(item => {
map[item[0]] ? map[item[0]]++ : (map[item[0]] = 1);
map[item[1]] ? map[item[1]]++ : (map[item[1]] = 1);
});
// 淘汰包含出现小于1字母的数组, 避免无用递归
arr = arr.filter(item => {
return (map[item[0]] > 1 && map[item[1]] > 1);
});
let dfs = (_point, _arr) => {
for(let i = _arr.length; i--; ) {
let item = _arr[i];
if(item[0] === _point || item[1] === _point) {
if(result.length === 0 && item[1] === _point) {
[item[0], item[1]] = [item[1], item[0]];
}
let tempArr = Object.assign(_arr); // 复制一个数组副本,方便回溯
tempArr.splice(i, 1); // 从临时数组中删去当前组,进一步递归
if(item[1] === point || dfs(item[1], tempArr)) {
// 如果找到答案,一层层往上返回
// 不带下划线的point是全局的目标point
result.unshift(item);
return true;
}
}
}
return false;
};
if(dfs(point, arr)){
console.log(result);
} else {
console.log('no result');
}
添加回答
举报
