FE-Interview icon indicating copy to clipboard operation
FE-Interview copied to clipboard

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

Open lgwebdream opened this issue 5 years ago • 66 comments
trafficstars

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

lgwebdream avatar Jun 19 '20 12:06 lgwebdream

/**
 * @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 avatar Jun 22 '20 14:06 Genzhen

/**
 * 题目:字符串出现的不重复最长长度
 * 整体思路:
 * 用一个滑动窗口装没有重复的字符,枚举字符记录最大值即可
 * 对于遇到重复字符如何收缩窗口大小?
 * 我们可以用 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
};

Genzhen avatar Jun 22 '20 14:06 Genzhen

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;
}

wangyingjie123 avatar Jul 12 '20 13:07 wangyingjie123

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);

123456zzz avatar Jul 13 '20 15:07 123456zzz

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

不会调整格式凑合看

chengming9731 avatar Jul 16 '20 03:07 chengming9731

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

不会调整格式凑合看

不是这样吧

jzsn2018 avatar Jul 17 '20 06:07 jzsn2018

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

cool-518 avatar Jul 17 '20 07:07 cool-518

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

cool-518 avatar Jul 17 '20 07:07 cool-518

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)
}

pioneer22 avatar Jul 17 '20 09:07 pioneer22

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

不会调整格式凑合看

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

Snailmar avatar Jul 18 '20 03:07 Snailmar

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)

yangbibo avatar Jul 18 '20 06:07 yangbibo

/*
 * @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

cody1991 avatar Jul 18 '20 10:07 cody1991

var lengthOfLongestSubstring = function (s = '') { let map = new Map(); let i = -1, res = 0, len = s.length; for(let j = 0; j < len; 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); } }

GolderBrother avatar Jul 20 '20 14:07 GolderBrother

var maxLen = function(s){
    let max = 0;
    let str = '';
    for(let i=0;i<s.length;i++){
        if(str.indexOf(s[i]) < 0) {
            str += s[i];
            if(str.length>max){
                max = str.length;
            }
        } else {
            str = str.slice(str.indexOf(s[i])+1) + s[i];
        }
    }
    return max;
}

Kelier avatar Jul 23 '20 03:07 Kelier

遍历的同时,进行截取比较

let str = 'fdsfsdzffdfdddfsdsds'

let arr = []
const s = str.split('')
let total= 0; // 长度
let maxStr = '' // 最长不重复长度的字符串
for(var i = 0;i <s.length;i++){
    const ele = s[i]
    const idx = arr.indexOf(ele)
    if(idx>-1){
        arr = arr.slice(idx+1)
    }
    arr.push(ele)
    if(arr.length>total){
        maxStr = arr.join('')
        total = arr.length
    }
}

console.log(total)
console.log(maxStr)

Z6T avatar Jul 29 '20 09:07 Z6T

const twoSum = function(nums, target) { let a, b; for(let i = 0; i < nums.length; i++) { let tmp = target - nums[i]; let arr = nums.slice(i+1); let ind = arr.indexOf(tmp); if(ind > -1){ a = i; b = i + 1 + ind; break; } } return [a, b]; };

pangyongsheng avatar Jul 29 '20 15:07 pangyongsheng

function fn(s) {
    let temps = '',max=0
    for(let i=0;i<s.length;i++){
        let current = s[i]
        if(temps.indexOf(s[i]) !== -1){
            temps = temps.substring(temps.indexOf(s[i])+1)            
        }
        temps += current
        max = Math.max(temps.length, max)
    }
    return max
}

chun1hao avatar Jul 31 '20 03:07 chun1hao

function maxLength(str) {
    let res = []
    let arr = str.split('')
    let max=0
    while (arr.length>0) {
        let cur = arr.shift()
        if(!res.includes(cur)){
            res.push(cur)
        }else{
            max=Math.max(max, res.length)
            res = []
        }
    }
    console.log(max)
}
maxLength('112345123')

xcgs123 avatar Aug 01 '20 10:08 xcgs123

function longNoRepeatStr(str) {
      if (Object.prototype.toString.call(str) !== '[object String]') throw 'unvalid string'
      let arr = str.split('')
      return Array.from(new Set(arr)).length
}
console.log(longNoRepeatStr('ssdfsd'))

Hasky0911 avatar Aug 06 '20 02:08 Hasky0911


/**
 * @param str {string}
 * 使用快慢双指针;对比快慢指针所指的值,如果不相等则计数加1,否则计数重置
 */
function maxNoRepeatStr (str) {
	// 为空时,直接返回0
    if (!str) {
        return 0;
    }

	// 慢指针指向0
    let slow = 0;
	// 快指针指向1
    let fast = 1;
	// 计数默认为1 - 至少一个不重复
    let count = 1;

	// 当快指针走到结尾时停止
    while (str.length > fast) {
		// 不相等,计数加1
        if (str[slow] !== str[fast]) {
            count++;
        } else {
			// 重置为1
            count = 1;
        }
		// 快慢指针同时走
        slow++;
        fast++;
    }

    return count;
}

console.assert(maxNoRepeatStr("loddktdji") === 6);
console.assert(maxNoRepeatStr("dvdf") === 4);
console.assert(maxNoRepeatStr("adfafwefffdasdcx") === 7);

mirinzhang avatar Aug 22 '20 07:08 mirinzhang

function strNorepeatMaxLength (str) { let repeatIndex = 0, maxLength = 0;; for (let i = 0; i < str.length; i++) { if (i > 0 && (str[i] === str[i - 1])) { if (i - repeatIndex > maxLength) { maxLength = i - repeatIndex; } repeatIndex = i; }
} return maxLength === 0 ? str.length : (str.length - repeatIndex > maxLength ? str.length - repeatIndex : maxLength); } strNorepeatMaxLength("1234555123456") // 输出7

GitHubzwd avatar Aug 24 '20 07:08 GitHubzwd

const str = "efdfabcdefghiabbcccdef";
const len = str.length;
let maxStr = "";

// 获取所有可能
for (let i = 0; i < len; i++) {
    let temp = "";

    for (let j = i; j < len; j++) {
        
        if (!temp.includes(str[j])) {
            temp += str[j];
        } else {
            break;
        }
    }
    
    if (temp.length > maxStr.length) {
        maxStr = temp;
    }
}

console.log(maxStr);

huzedong2015 avatar Aug 28 '20 07:08 huzedong2015

str.length?

webzsp avatar Sep 03 '20 04:09 webzsp

function maxStrLen(str) {
    if (!str) return 0;
    let arr = str.split('')
    let max = 0
    for (i = 0; i < str.length; i++) {
        arr[i] = 'pass'
        let index = arr.indexOf(str[i])
        if (index !== -1 && index - i > max) max = index - i
    }
    return max
}
maxStrLen('pwwkew')
maxStrLen('abcabcbb')
maxStrLen('bbbbb')
maxStrLen('123456125')
maxStrLen('123 45 6125')
maxStrLen('')

RainyNight9 avatar Sep 08 '20 07:09 RainyNight9

/**
 * @param {string} s
 * @return {number}
 */
function lengthOfLongestSubstring (str) {
  if (str.length === 0 || str.length === 1) {
    return str.length;
  }

  let start = 0;
  let end = 0;
  let maxStr = str[0];
  let location = {
    [str[0]]: 0
  }
  for (let index = 1; index < str.length; index++) {
    const char = str[index];
    if (typeof location[char] !== 'undefined') {
        if (location[char] >= start) { 
            start = location[char] + 1;
        }
    }
    location[char] = index;
    end++;

    if ((end - start + 1) > maxStr.length) {
      maxStr = str.substring(start, end + 1);
    }
  }
  return maxStr.length;
}

carbrokers avatar Sep 10 '20 09:09 carbrokers

function str(str) {
				if (typeof str !== 'string') return 0;
				let strArr = [...str];
				let prev = '';
				let curr = '';
				let length = 1;
				let max = 1;
				for (let i = 0; i < strArr.length - 1; i++) {
					prev = strArr[i];
					curr = strArr[i + 1];
					if (prev !== curr) {
						length++;
					} else {
						max = Math.max(max, length);
						length = 1;
					}
				}
				return Math.max(max, length);
			}

说下思路,每个字符比较,如果有相同就保存当前length,没有就++,最后对比。

jesse-li avatar Sep 16 '20 04:09 jesse-li

这题目没看懂

467057463 avatar Sep 16 '20 08:09 467057463

/**
 * [noRepeaMaxLenStr description]
 * @param  {String} str [字符串]
 * @return {[type]}     [description]
 */
function noRepeaMaxLenStr(str = '') {
  let arr = [...str],
      start = end = arr.shift(),
      resArr = [],
      len = 0;
      str = '';
  for (let v of arr) {
    if (v === start) {
      resArr.push(end);
      start = end = v;
    } else {
      start = v;
      end+= v;
    }
  }
  resArr.push(end);
  console.log(resArr);
  for(let v of resArr) {
    if (len < v.length) {
      len = v.length;
      str = v;
    }
  }
  console.log({len, str})
  return {len, str};
}

noRepeaMaxLenStr('abbcdeefg');
noRepeaMaxLenStr('aaabcdeeeff');
noRepeaMaxLenStr('abccdeffgg');

noney avatar Oct 22 '20 10:10 noney

const longestLength = (string) => {
    const length = string.length;
    const recordArr = [];
    for(let i = 0; i < length; i++) {
        const arr = string.split('');
        const emptyArr = [];
        for(let j = 0; j < length - i; j++) {
            emptyArr.push(arr[i + j]);
            const newSetArr = [...new Set(emptyArr)];
            if(newSetArr.length !== emptyArr.length) {
                recordArr.push(newSetArr.length)
                break;
            } else if(j === length - i - 1) {
                recordArr.push(newSetArr.length)
            }
        }
    }
    return Math.max.apply(null, recordArr);
}

console.log('this is',longestLength('1lksdmfkdfasdfasdf20393'));

Patrick9527 avatar Oct 24 '20 06:10 Patrick9527

function maxNoRepeatStr(str){
  if(typeof str !== 'string') return console.warn("Expected string, But got " +  typeof str);
  let noRepeatStr = '';
  let lastIndex = str.length - 1;
  let max = 0;

  do {
     const last = str[lastIndex], next = str[lastIndex-1];
     last === next?
     noRepeatStr = '':
     noRepeatStr += last;
     max = Math.max(max, noRepeatStr.length + 1);
  } while (--lastIndex);

  return max;
}
console.assert(maxNoRepeatStr("loddktdji") === 6);
console.assert(maxNoRepeatStr("dvdf") === 4);
console.assert(maxNoRepeatStr("adfafwefffdasdcx") === 8);

linbaichuan0818 avatar Nov 04 '20 17:11 linbaichuan0818