标签:
原题链接: 题目描述:在字符串s中计算最长无重复的子串 思路一:采用双指针的方法处理,开始和结束指针,结束指针从头往后遍历一遍,遍历的过程中当前这个元素如果在这个子串中,开始指针重新计算(开始指针加上移动的元素个数),没有在这个子串中,重新计算长度,遍历完成后返回长度。
/** * @param {string} s * @return {number} */ var lengthOfLongestSubstring = function(s) { let len = s.length let res = 0 for (let start = 0, end = 0; end < len; end++) { let index = s.slice(start, end).indexOf(s[end]) if (index !== -1) { //index是下标,从0开始的,移动的元素个数为index+1 start = start + index + 1 } res = Math.max(res, end - start + 1) } return res };
思路二:利用数组来存储
let s = abbbc function longestSubstring(s) { let res = [], max = 0 for (let i = 0; i < s.length; i++) { let index = res.indexOf(s[i]) //找到值进行截取 if (index != -1) { res.splice(0, index + 1) } res.push(s[i]) //没找到重新计算长度 max = Math.max(max, res.length) } return max } console.log(longestSubstring(s))
思路三:利用map查找当前元素是否已经存在,如果存在重新计算开始位置,不存在重新计算长度
var lengthOfLongestSubstring = function(s) { let map = new Map() let left = 0, res = 0 for (let i = 0; i < s.length; i++) { //如果map中存在当前字符,重新计算左侧开始位置的指针 if (map.has(s[i])) { left = Math.max(map.get(s[i]) + 1, left) } res = Math.max(res, i - left + 1) //key值相同的时候,后面会覆盖前面的 map.set(s[i], i) } return res };
标签: 来源:
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。