最长回文子串解法
原题地址:https://leetcode.com/problems/longest-substring-without-repeating-characters/#/description
没咋么过脑子,瞬间能想到的思路大概为:
"abcabcbb"
比如这个字符串
首先 声明一个数组 里面存放各种开分来的字符串; 切分条件是当这次循环的值 存在于当前的数组中
比如这个字符串
首先 声明一个数组 里面存放各种开分来的字符串; 切分条件是当这次循环的值 存在于当前的数组中
像这样
abc bca cab abc bcb cb
abc bca cab abc bcb cb
最初的实现代码:
var str = ""; //生成一些随机字符 for(var i =0;i<1000000;i++){ str +=String.fromCharCode(Math.floor(97+Math.random()*(122-97))); } var resulte = [];//保存字符串结果 var index = 0;//索引 while(str.length){ for(var i =0;i<str.length;i++){ resulte[index] = resulte[index]||""; if(resulte[index].indexOf(str[i]) === -1){ resulte[index]+=str[i]; }else{ break; } } str = str.slice(1); index++; } console.log(resulte)
第二日优化代码:
思路:
bcadeaopqrxyz
当上面的2个a 相遇的时候
第一个数组中应该存放的值为: bcade
首先能确定的是 bcade 肯定是正确的格式(无重复的字符串)
其次能确定的是 bcadea 绝对大过于 cade ade de
也就是说 第一个a之前的值不用再循环了,循环直接从第一个a后面的值开始即可;
var str = ""; //生成一些随机字符 for(var i =0;i<1000000;i++){ str +=String.fromCharCode(Math.floor(97+Math.random()*(122-97))); } var resulte = [];//保存字符串结果 var index = 0;//索引 var maxStr = ""; while(str.length){ for(var i =0;i<str.length;i++){ resulte[index] = resulte[index]||""; if(maxStr.length > str.length){ str = ""; break; } var _pos = resulte[index].indexOf(str[i]); var _step = 0; if(_pos === -1){ resulte[index]+=str[i]; maxStr = maxStr.length < resulte[index].length ? resulte[index] : maxStr; }else{ // resulte[index+1] = resulte[index].slice(_pos+1) //这里还可优化 _step = str.indexOf(str[i]); break; } } str = str.slice(_step+1); index++; } console.log(maxStr)