图谱出来后,发现有规律,从起始位置开始找,找到一位结果向下一位,找到一位结果向下一位。也就是说他每找到一个结果,他会把从下一位开始到最终作为一个子串,作为子输入。比如说从第一位0开始,到最终到结尾,这就是一个子串。然后从第二位开始,第一位就不用管了。从第二位到结尾作为一个新的输入。这个叫做子输入。这个时候就需要用到递归了,因为这个是动态的,而且这个动态之间是有关系的。这就是递归的本质。
export default (str) => { // 建立数据结构,堆栈,保存数据 let r = []; // 给定任意子输入都返回第一个符合条件的子串 let match = (str) => { // 找到最开始的连续的 0 或者 1 let j = str.match(/^(0+|1+)/)[0]; // 运用 0^1 1^1 巧妙的进行取反。0^1=1,1^1=0。repeat()用于复制,比如 ‘12’.repeat(3)=‘121212‘。里面是要复制的次数 let o = (j[0] ^ 1).toString().repeat(j.length); let reg = new RegExp(`^${j}${o}`); if (reg.test(str)) { return `${j}${o}` } else { return ‘‘; } } // 通过for循环控制程序运行的流程 for (let i = 0, len = str.length - 1; i < len; i++) { let sub = match(str.slice(i)); if (sub) { r.push(sub); } } return r; }
原文:https://www.cnblogs.com/wzndkj/p/11922867.html