给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
var lengthOfLongestSubstring = function(s) {
// 将设s = 'dydf'
var str =''
var res = []
for (let i of s ){
// 查找有无重复的无重复加到str中
var index = str.indexOf(i)
if(index < 0){
str +=i
}else{
// dyd 将yd 重新赋值到str中 substr获取对应索引到后面的字符串
res.push(str) // 将重复前的放进数组里
str = str.substr(index + 1) + i // y + d
}
}
// 将最后的str 放进数组
res.push(str)
res.sort((a,b)=> b.length - a.length) // 对数组进行降序排序
return res[0].length
};
2、 第一个只出现一次的字符
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
示例 1:
输入:s = "abaccdeff"
输出:'b'
示例 2:
输入:s = ""
输出:' '
var firstUniqChar = function(s) {
var obj = {}
for(let i of s){
if(!obj[i]){
obj[i] = 1
}else{
obj[i] ++
}
}
for(let i in obj){
if(obj[i]==1) return i
}
return ' '
};
3、连续数组
// 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。
创建一个哈希表,用 keykey 来储存 curcur 值, valuevalue 来储存当前 indexindex。
假设我们碰到0就将 curcur decrementdecrement (减一), 碰到1则incrementincrement (加一)。
如果我们能在哈希表中找到当前的 curcur 值, 则取出对应的 pospos, 在看当前的 index - pos 是否比 ans 大, 取其中的最优解。
核心:由于以上碰1加一,碰0减一的操作,当0与1数量一致时(连续数组), 其连续数组的和为零。因此我们知道数组前面的 curcur 值是什么,在到达该连续数组尾部时就不会变。因此我们只需要检查哈希表中是否存在其相同的 curcur 值即可!
var findMaxLength = function(nums) {
let maxLength = 0;
const map = new Map();
let counter = 0;
map.set(counter, -1);
const n = nums.length;
for (let i = 0; i < n; i++) {
const num = nums[i];
if (num == 1) {
counter++;
} else {
counter--;
}
if (map.has(counter)) {
const prevIndex = map.get(counter);
maxLength = Math.max(maxLength, i - prevIndex);
} else {
map.set(counter, i);
}
}
return maxLength;
};
输入([0,0,1,0,0,0,1,1])
log(6)