1. 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
var lengthOfLongestSubstring = function (s) {
// 思路: 滑动窗口问题
let left = 0;
let right = 1;
let max = 0;
if(s.length <= 1) return s.length;
while(right < s.length){
let temp = s.slice(left, right);
if(temp.indexOf(s.charAt(right)) > -1 ){
left++;
} else {
right++;
}
if(right - left > max) {
max = right - left;
}
}
return max;
}
2.最接近的三数之和
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在恰好一个解。
示例 1:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
示例 2:
输入:nums = [0,0,0], target = 1
输出:0
var threeSumClosest = function (nums, target) {
// 思路: 先排序,固定一个值,再用双指针求和比较绝对值
let result = Number.MAX_SAFE_INTEGER;
nums.sort((a,b) => a-b);
for(let i=0; i<nums.length; i++) {
let left = i + 1;
let right = nums.length - 1;
while(left < right) {
let sum = nums[i] + nums[left] + nums[right];
if(Math.abs(sum - target) < Math.abs(result - target)){
result = sum;
}
if(sum < target){
left++;
} else if(sum > target) {
right--;
} else {
return sum;
}
}
}
return result;
}
3.通过删除字母匹配到字典里最长单词
给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。
如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在,则返回空字符串。
示例 1:
输入:s = “abpcplea”, dictionary = [“ale”,“apple”,“monkey”,“plea”]
输出:“apple”
示例 2:
输入:s = “abpcplea”, dictionary = [“a”,“b”,“c”]
输出:“a”
var findLongestWord = function (s, dictionary) {
// 思路:遍历数组,利用双指针对比其子项与目标
let str = '';
for(let i=0; i< dictionary.length; i++){
let left = 0,right=0;
while(left < s.length && right < dictionary[i].length){
if(s.charAt(left) == dictionary[i].charAt(right)){
right++;
}
if(right == dictionary[i].length ){
if(dictionary[i].length > str.length || (dictionary[i].length == str.length && dictionary[i] < str)){
str = dictionary[i];
}
}
left++;
}
}
return str;
}