1昆著、無重復(fù)字符的最長子串
給定一個字符串省容,請你找出其中不含有重復(fù)字符的 **最長子串 **的長度。
示例:
輸入: s = "abcabcbb"
輸出: 3
解釋: 因為無重復(fù)字符的最長子串是 "abc"匀油,所以其長度為 3缘缚。
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
let arr = [], max = 0;
for( let i = 0; i < s.length; i++ ) {
let index = arr.indexOf(s[i]);
if( index !== -1 ) {
arr.splice( 0, index+1 );
}
arr.push( s.charAt(i) );
max = Math.max(arr.length, max);
}
return max;
};
2、最長回文子串
給你一個字符串 s
敌蚜,找到 s
中最長的回文子串忙灼。
思路:對于一個回文子串,例如cbabc钝侠,去掉首尾的c,它依舊是一個回文子串酸舍。因此我們可以通過P(i,j)表示從下標i到j(luò)是否是回文字符串帅韧,狀態(tài)轉(zhuǎn)移方程:P(i,j) = P(i+1,j-1)^(s[i]===s[j])。
示例:
輸入:s = "babad"
輸出:"bab"
解釋:"aba" 同樣是符合題意的答案啃勉。
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
let n = s.length;
let res = '';
let dp = Array.from( new Array(n),() => new Array(n).fill(0) );
for( let i = n-1; i >= 0; i-- ) {
for( let j = i; j < n; j++ ) {
dp[i][j] = s[i] == s[j] && (j - i < 2 || dp[i+1][j-1]);
if(dp[i][j] && j - i +1 > res.length){
res = s.substring(i, j+1);
}
}
}
return res;
};
3忽舟、兩數(shù)之和
給定一個整數(shù)數(shù)組 nums
和一個整數(shù)目標值 target
,請你在該數(shù)組中找出 和為目標值 的那 兩個 整數(shù)淮阐,并返回它們的數(shù)組下標叮阅。
思路:通過哈希表,將出現(xiàn)的元素以(key:數(shù)組泣特,value:下標)浩姥,當(dāng)我們遍歷每一個元素時,只需要判斷target - nums[i]是否在哈希表存在值就可以状您。
示例:
輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 勒叠,返回 [0, 1] 兜挨。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var map = new Map();
for(var i=0;i<nums.length;i++) {
// 判斷哈希表中是否存在相應(yīng)target - nums[i]值。
if(map.has(target - nums[i]) && map.get(target - nums[i]) !== i) {
return [map.get(target - nums[i]), i];
}
map.set(nums[i], i);
}
return []
};