LeetCode刷题(3)

139 阅读1分钟

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战

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

描述

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3

题解

方案一,暴力解法,

通过循环遍历,加上Set,来不断的寻找,无重复的最长的字串

方案二,双指针,滑动窗口

左指针定义一个起点,右指针往右侧扩张

如果找到相同的元素,左指针往右移动,继续右指针

类似一个滑动窗口

/**
 * @param {string} s
 * @return {number}
 */
// 方案一,暴力解法,
var lengthOfLongestSubstring = function(s) {
  let result = 0;
  let n = s.length;
  for (let i = 0; i < n; i++) {
    let set = new Set();
    let count = 0;
    let j = i;
    // 从j开始循环
    while(j < n && !set.has(s[j])) {
      set.add(s[j]);
      count++;
      j++;
    }
    result = Math.max(result, count);
  }
return result;
};
// 方案二,双指针法
var lengthOfLongestSubstring = function(s) {
 		let n = s.length;
    let left = 0;
  let right = 0;
  let set = new Set();
  let result = 0;
  while (left < n) {
    
    // 右指针开始向右移动
    while(right < n && !set.has(s[right])) {
      set.add(s[right]);
      right++;
    }
    // 找到了重复的
    result = Math.max(result, right - left);
    // 删除左侧的set,继续,直到窗口无重复数据
    set.delete(s[left]);
    left++;
  }
  return result;
};


5. 最长回文子串

leetcode-cn.com/problems/lo…

描述

给你一个字符串 s,找到 s 中最长的回文子串。

示例

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

题解


/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    if (s.length === 1) return s;
    let maxRes = 0, maxStr = '';
    for (let i = 0; i < s.length; i++) {
        let str1 = palindrome(s, i, i);
        let str2 = palindrome(s, i, i + 1);   
        if (str1.length > maxRes) {
            maxStr = str1;
            maxRes = str1.length;
        }
        if (str2.length > maxRes) {
            maxStr = str2;
            maxRes = str2.length;
        }
    }
    return maxStr;
};
function palindrome(s, l, r) {
    while (l >= 0 && r < s.length && s[l] === s[r]) {
        l--;
        r++;
    }
    return s.slice(l + 1, r);
}


69. x 的平方根

69. x 的平方根LeetCode

描述

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例

输入: 4
输出: 2

解析

因为 a*a = x 所以使用二分查找方法,来查找这个值

/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
	let left = 0;
  let right = x;
  while (left <= right) {
    let mid = Math.floor((left + right) / 2);
    if (mid * mid < x) {
      left = mid + 1;
    } else if (mid * mid > x){
      right = mid - 1;
    } else {
      return mid;
    }
  }
  return right;
  
};