Skip to content

第 4 题:字符串出现的不重复最长长度 #10

@lgwebdream

Description

@lgwebdream
Owner

欢迎在下方发表您的优质见解

Activity

Genzhen

Genzhen commented on Jun 22, 2020

@Genzhen
Collaborator
/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
    const arr = [...s]
    let res = 1;
    let result = arr.reduce((total, cur, i, arr) => {
        if (i == 0) {
            return cur;
        } else {
            if (total.indexOf(cur) < 0) {
                return total + cur
            } else if (res < total.length) {
                res = total.length
                return total.slice(total.indexOf(cur) + 1, total.length) + cur
            } else {
                return total.slice(total.indexOf(cur) + 1, total.length) + cur
            }
        }
    }, "")
    if (res < result.length) {
        res = result.length
    }

    return res
};

console.log(lengthOfLongestSubstring("loddktdji"))
console.log(lengthOfLongestSubstring("dvdf"))
console.log(lengthOfLongestSubstring("adfafwefffdasdcx"))
Genzhen

Genzhen commented on Jun 22, 2020

@Genzhen
Collaborator
/**
 * 题目:字符串出现的不重复最长长度
 * 整体思路:
 * 用一个滑动窗口装没有重复的字符,枚举字符记录最大值即可
 * 对于遇到重复字符如何收缩窗口大小?
 * 我们可以用 map 维护字符的索引,遇到相同的字符,把左边界移动过去即可
 * 挪动的过程中记录最大长度
 */
var lengthOfLongestSubstring = function (s) {
    let map = new Map();
    let i = -1
    let res = 0
    let n = s.length
    for (let j = 0; j < n; j++) {
        if (map.has(s[j])) {
            i = Math.max(i, map.get(s[j]))
        }
        res = Math.max(res, j - i)
        map.set(s[j], j)
    }
    return res
};
wangyingjie123

wangyingjie123 commented on Jul 12, 2020

@wangyingjie123
function lengthOfLongestSubstring(s) {
   let max = 0;
   let arr = [];
  for (let i = 0; i < s.length; i++) {
   let index = arr.indexOf(s[i]);
   if (index !== -1) {
      arr.slice(0, index + 1);
  }
  arr.push(s[i]);
  max = Math.max(max, arr.length);
}
return max;
}
123456zzz

123456zzz commented on Jul 13, 2020

@123456zzz
const lengthOfLongestSubString = (s: string) => {
  let left = 0,
    right = 0,
    res = 0,
    map = new Map();
  while (right < s.length) {
    if (map.has(s[right])) {
      left = Math.max(left, right);
    }
    res = Math.max(res, right - left + 1);
    map.set(s[right], right);
    right++;
  }
  return res;
};

console.assert(lengthOfLongestSubString("") === 0);

console.assert(lengthOfLongestSubString("aa") === 1);

console.assert(lengthOfLongestSubString("aabc") === 3);
chengming9731

chengming9731 commented on Jul 16, 2020

@chengming9731
function lenSetStr (str) {
    return [...new Set(str)].length
}

不会调整格式凑合看

jzsn2018

jzsn2018 commented on Jul 17, 2020

@jzsn2018
function lenSetStr (str) {
    return [...new Set(str)].length
}

不会调整格式凑合看

不是这样吧

cool-518

cool-518 commented on Jul 17, 2020

@cool-518

麻烦把题目表述清楚行吗?装什么呢,中文没学好?

cool-518

cool-518 commented on Jul 17, 2020

@cool-518

@wangyingjie123 楼上的,写的对不对自己没数吗?能不能自己充分验证了再发出来?

pioneer22

pioneer22 commented on Jul 17, 2020

@pioneer22
function lengthOfStr (str) {
  let res = ""
  let result = [...str].reduce((acc, v, i) => {
    if (i === 0) {
      return v;
    } else {
      if (acc.indexOf(v) < 0) {
        return acc + v
      } else {
        res = res.length < acc.length ? acc : res
        return acc.slice(acc.indexOf(v) + 1, acc.length) + v
      }
    }
  }, "")
  console.log(res.length > result.length ? res : result)
  return Math.max(res.length, result.length)
}
Snailmar

Snailmar commented on Jul 18, 2020

@Snailmar
```js
function lenSetStr (str) {
    return [...new Set(str)].length
}

不会调整格式凑合看

你这何止是不会调格式,你这是不会读题啊!

yangbibo

yangbibo commented on Jul 18, 2020

@yangbibo

var str = 'abacvdtrgasgdoijmiqunvlhsdanwqp';
var longStr = (str) => {
var long = 0;
var arr = []
for(var i=0;(i+long)<str.length;i++){
var index = arr.indexOf(str[i]);
arr.push(str[i]);
if(index!==-1){
arr.splice(0,index+1)
}
long = Math.max(arr.length,long)
}
return long
}
longStr(str)

cody1991

cody1991 commented on Jul 18, 2020

@cody1991
/*
 * @Author: codytang
 * @Date: 2020-07-18 17:54:20
 * @LastEditTime: 2020-07-18 18:01:55
 * @LastEditors: codytang
 * @Description: 第 4 题:字符串出现的不重复最长长度
 */

function longNoRepeatStr(str) {
  let max = -Infinity;
  let count = 0;
  let pre = null;

  for (let index = 0; index < str.length; index += 1) {
    const cur = str[index];

    if (cur !== pre) {
      count += 1;
    } else {
      count = 1;
    }

    pre = cur;
    if (count > max) max = count;
  }
  return max;
}

console.log(longNoRepeatStr("aabccddabcde"));  //6

40 remaining items

kongdesheng123

kongdesheng123 commented on May 25, 2021

@kongdesheng123
	function maxlength(str) {
		if(typeof str != 'string') {
			return '不是字符串';
		}
		var arr = [...str];
		var res = [];
		var max = 0;
		while(arr.length > 0) {
			let value = arr.shift();
			if(!res.includes(value)) {
				res.push(value)
			} else {
				let index = res.findIndex(function(currentValue, index, arr) {
					return currentValue == value
				});
				max = Math.max(max, res.length)
				res.push(value)
				if(res[index] == value) {
					res = res.slice(index + 1)
				}

			}
		}
		max = Math.max(max, res.length)
		console.log(max)
	}

	maxlength('abbba1234567')
qq820137708

qq820137708 commented on May 27, 2021

@qq820137708
const lengthOfLongestSubstring = function (s) {
    let map = new Map();
    let i = -1
    let res = 0
    let n = s.length
    for (let j = 0; j < n; j++) {
        if (map.has(s[j])) {
            i = Math.max(i, map.get(s[j]))
        }
        res = Math.max(res, j - i)
        map.set(s[j], j)
    }
    return res
};
console.log(lengthOfLongestSubstring("abcabcdeabcd"))
Luoyuda

Luoyuda commented on Jun 9, 2021

@Luoyuda
function lengthOfLongestSubstring(s){
        let i = 0
        let j = 0
        let n = s.length
        let set = new Set()
        let max = 0
        while(j < n){
            while(set.has(s[j])){
                set.delete(s[i++])
            }
            set.add(s[j])
            j++
            max = Math.max(max, j - i)
        }
        return max
    }
CYLpursuit

CYLpursuit commented on Jun 21, 2021

@CYLpursuit
function maxLenNoRepeatStr(str) {
  if (str.length < 2) return str.length;
  let strSplitStr = '';
  let maxLen = 0;
  for(let s of str) {
    if (strSplitStr.indexOf(s) === -1) {
      strSplitStr += s;
    } else {
      maxLen = Math.max(maxLen, strSplitStr.length);
      strSplitStr = '';
    }
  }
  return Math.max(maxLen, strSplitStr.length);
};
chenning111

chenning111 commented on Jul 27, 2021

@chenning111

function lengthOfLongestSubString (str){
let obj = {};
for(let i=0;i<str.length;i++){
let ele = str[i]
if(!obj.hasOwnProperty(ele)){
obj[ele] = 1;
}else{
obj[ele]+=1
}
}
// 有需求还可以计算出现最多的字符
return Object.keys(obj).length
}
lengthOfLongestSubString('asdfasewr')

changliu08

changliu08 commented on Sep 8, 2021

@changliu08

function maxSubString(str) {
var temp, max_str = "";
str.match(/(\w)\1+/g).forEach(function (item) {
temp = str.split(item);
str = temp[1];
if (temp[0].length > max_str.length) {
max_str = temp[0];
}
});
return max_str;
}

kanWohuilan

kanWohuilan commented on Oct 12, 2021

@kanWohuilan

function Fn(str) {
let len = 0;
let arr = [];
let j = 0;
str = str.split('')
for (let i = 0; i < str.length; i++) {
for (let l = 0; l < str.slice(j).length; l++) {
const element = str.slice(j)[l];
if (!arr.includes(element)) {
arr.push(element);
} else {
len = len > arr.length ? len : arr.length;
arr = [];
j++;
break;
}
}
}
console.log(len);
return len
}
这道题不能改变str的序列吧 是我的理解有问题吗

18602435705

18602435705 commented on Dec 24, 2021

@18602435705
/**
 * 最长无重复子串
 * 移动窗口法
 * @param {*} str
 */
function maxLength(str) {
  const set = new Set();
  let max = ""; // 最大子串
  let left = 0; // 左指针left,右指针i
  for (let i = 0; i < str.length; i++) {
    const char = str[i];
    // 有重复,左指针移到右指针,清空set
    if (set.has(char)) {
      left = i;
      set.clear();
    } else {
      // 如果窗口扩大了,就记录新的子串
      if (i - left + 1 > max.length) {
        max = str.slice(left, i + 1);
      }
    }
    set.add(char);
  }
  console.log(max);
}

maxLength("abcabcdagaiuytaabb"); // 输出aiuyt
shber

shber commented on Dec 28, 2021

@shber

`var lengthOfLongestSubstring = function (s) {
var arr = s.split('')
var tag = 0
var map = new Map()
arr.forEach((res, i)=>{
if(!map.has(res)){
map.set(res, i)
tag = i
}
})
return tag

};`

abenlizhiyong

abenlizhiyong commented on Mar 10, 2022

@abenlizhiyong

function findMaxSizeDiffOfStr(strInput){
if(typeof strInput !== 'string') throw new Error("Pls enter a string...")
if(strInput === ""){
return 0;
}
let strLen = strInput.length;
let tempStr = [];
for(var i = 1 ; i < strLen ; i++){
for(var j = i ; j < strLen ; j++){
if(strInput.substring(i-1,j).indexOf(strInput.charAt(j) ) === -1){
tempStr.push(strInput.substring(i-1,j+1));
// maxSize = tempStr.length;
}else{
break;
}
}
}
let tempSize = tempStr.map(item=>item.length)
console.log(tempSize)
console.log(Math.max.apply(null,tempSize))
return Math.max.apply(null,tempSize);
}

// findMaxSizeDiffOfStr("abccccfedggggggg");
// findMaxSizeDiffOfStr("pwwkew");

AAA611

AAA611 commented on Aug 25, 2022

@AAA611
    function fn(s) {
      let res = ''
      let max = 0
      for (let c of s) {
        let index = res.indexOf(c)
        if (index === -1) {
          res += c
        } else {
          res = res.slice(index + 1) + c
        }
        max = Math.max(res.length, max)
      }
      return max
    }
lang711

lang711 commented on Aug 25, 2022

@lang711
    function noRepeat(str) {
      let map = new Map()
      let result = 0
      for (let i = 0; i < str.length; i++) {
        if (map.has(str[i])) {
          i = map.get(str[i])
          map.clear()
        } else {
          map.set(str[i], i)
        }
        result = Math.max(result, map.size)
      }
      return result
    }
    // 测试
    let str = 'sosfsdfjkttu'
    console.log(noRepeat(str));
blueprint1453

blueprint1453 commented on Jul 9, 2023

@blueprint1453

利用双指针 迭代过程中更新最大长度

function fn(str) {
    let left = 0, right = 0
    let maxLen = 0
    while(left <= right && right < str.length) {
      const index = str.slice(left, right + 1).indexOf(str[right + 1])
      maxLen = Math.max(maxLen, str.slice(left, right + 1).length)
      if (index > -1) {
        right++
        left = right
      } else {
        right++
      }
    }
    return maxLen;
  }
muzi-you

muzi-you commented on Apr 24, 2024

@muzi-you

应该是力扣上这个题吧:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/
无重复字符的最长子串

var lengthOfLongestSubstring = function(s) {
    let len = s.length;
    let set = new Set();
    let l = 0, res = 0;
    for (let i = 0; i < len; i++) {
        const char = s[i];
        while (set.has(char)) {
            set.delete(s[l]);
            l++
        }
        set.add(char);
        res = Math.max(res, i - l + 1);
    }
    return res;
};
aaronxdd

aaronxdd commented on Sep 7, 2024

@aaronxdd

/**

  • 数组比较好理解,所以此解法采用数组
  • 我们可以用数组存放不重复的字符,遇到相同的字符,把数字重置并放入当前字符
  • 实时记录数组的长度并对比之前的长度取最大值
    */
    const lengthOfLongestSubString = (str) => {
    if (typeof str !== 'string') return 0;
    let length = 0;
    let maxArr = [];
    const newStrArr = Array.from(str);
    newStrArr.forEach((n) => {
    if (maxArr.includes(n)) {
    maxArr = [];
    }
    maxArr.push(n);
    length = Math.max(length, maxArr.length);
    });
    return length;
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @markduan@cody1991@jinzhe@lgwebdream@muzi-you

        Issue actions

          第 4 题:字符串出现的不重复最长长度 · Issue #10 · lgwebdream/FE-Interview