0
点赞
收藏
分享

微信扫一扫

JS 无重复字符 算法题

朱小落 2022-02-16 阅读 54

给定一个字符串 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)
举报

相关推荐

0 条评论