[LeetCode] 无重复字符的最长子串 & 最长回文子串

前言

博主最近在看新的工作机会,也是在找一些leetcode上比较高频的算法复习一下,这里分享两道算法题的解题。

3. 无重复字符的最长子串

[LeetCode] 无重复字符的最长子串 & 最长回文子串_第1张图片

解题思路:

此题不难想到使用哈希表+快慢双指针来进行重复字符的记录和遍历,每次字符串的遍历,快指针固定+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. 最长回文子串

[LeetCode] 无重复字符的最长子串 & 最长回文子串_第2张图片

解题思路:

回文数,其实就是自一个中间基准数起,左右的字符一模一样,如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一些比较冷门的题目,平时作为兴趣,复习的时候还是不会列入侧重点。

你可能感兴趣的:(leetcode,算法,职场和发展,javascript,前端)