“这是我参与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. 最长回文子串
描述
给你一个字符串 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;
};