简单
1. 给定一个字符串 str ,请你找出其中不含有重复字符的最长子串的长度。
输入: str = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。
var lengthOfLongestSubstring = function(str) {
if(str.length <= 1){return str.length}
let left = 0
let right = 1
let max = 0
let temp
while(right < str.length){
temp = str.slice(left, right)
if (temp.indexOf(str.charAt(right)) < 0) { // 不存在
right ++
} else {
left ++
continue
}
max = Math.max(max, right - left)
}
return max
};
2. 给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
输入: s = "babad"
输出: "bab"
解释: "aba" 同样是符合题意的答案。
var longestPalindrome = function(s) {
if(s.length < 2) return s
let res = ''
for(let i = 0; i < s.length; i++){
helper(i, i)
helper(i, i + 1)
}
function helper(m, n){
while(m >= 0 && n < s.length && s[m] == s[n]){
m--
n++
}
if(n - m - 1 > res.length){
res = s.slice(m + 1, n)
}
}
return res
};
3. 最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。
输入: nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
输出: 6
解释: 连续子数组 [4, -1, 2, 1] 的和最大,为 6 。
var maxSubArray = function(nums){
let currentSum = nums[0]
let maxSum = nums[0]
for(let i = 1; i < nums.length; i++){
currentSum = Math.max(currentSum + nums[i], nums[i])
maxSum = Math.max(maxSum, currentSum)
}
return maxSum
}
4. 和为k的子数组
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
输入: nums = [1, 2, 3], k = 3
输出: 2
var subarraySum = function(nums, k) {
let sum = 0, count = 0
let map = new Map([[0,1]])
for(let num of nums){
sum += num
count += map.get(sum - k) ?? 0
map.set(sum, (map.get(sum) ?? 0) + 1)
}
return count
}