您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~
前言
博主最近在看新的工作机会,也是在找一些leetcode上比较高频的算法复习一下,这里分享两道算法题的解题。
3. 无重复字符的最长子串
解题思路:
此题不难想到使用哈希表+快慢双指针来进行重复字符的记录和遍历,每次字符串的遍历,快指针固定+1,如果截取到的字符串中有重复字符,则将慢指针向前移动直到字符串中无重复字符。
贴代码
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
var left = 0, right = 0, max = 0, map = new Map();
while(right < s.length) {
//如果有重复的字符,移动慢指针并且删除慢指针对应哈希表中的字符
while(map.has(s[right]) && left < right) {
map.delete(s[left]);
left++;
}
map.set(s[right], 1);
max = Math.max(max, right - left + 1);
right++;
}
return max;
};
5. 最长回文子串
解题思路:
回文数,其实就是自一个中间基准数起,左右的字符一模一样,如bab、bbabb,他们的基数都是a,并且左右字符相同,因此他们是回文数。
因此可以采用双指针+中心扩散的解法,把字符串中所有的字符都作为基准数,中心扩散,并且记录最大的回文子串,即可。
贴代码
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
var max = '';
const dfs = (left, right) => {
//回文的情况,深度查找,继续向两边扩散
while(s[left] === s[right] && left >= 0 && right <= s.length ) {
left--;
right++;
}
return s.substr(left + 1, right - left - 1);
}
for(var i = 0; i < s.length; i++) {
const res1 = dfs(i, i);
const res2 = dfs(i, i + 1)
max = res1.length > max.length ? res1 : max;
max = res2.length > max.length ? res2 : max;
}
return max;
};
结尾
博主准备面试还是比较喜欢从一些高频次算法题和js手写性原理题下手复习,对于leetcode一些比较冷门的题目,平时作为兴趣,复习的时候还是不会列入侧重点。