FE-Interview
FE-Interview copied to clipboard
第 4 题:字符串出现的不重复最长长度
欢迎在下方发表您的优质见解
/**
* @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"))
/**
* 题目:字符串出现的不重复最长长度
* 整体思路:
* 用一个滑动窗口装没有重复的字符,枚举字符记录最大值即可
* 对于遇到重复字符如何收缩窗口大小?
* 我们可以用 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
};
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;
}
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);
function lenSetStr (str) {
return [...new Set(str)].length
}
不会调整格式凑合看
function lenSetStr (str) { return [...new Set(str)].length }不会调整格式凑合看
不是这样吧
麻烦把题目表述清楚行吗?装什么呢,中文没学好?
@wangyingjie123 楼上的,写的对不对自己没数吗?能不能自己充分验证了再发出来?
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)
}
```js function lenSetStr (str) { return [...new Set(str)].length }不会调整格式凑合看
你这何止是不会调格式,你这是不会读题啊!
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)
/*
* @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
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); } }
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;
}
遍历的同时,进行截取比较
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)
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]; };
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
}
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')
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'))
/**
* @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);
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
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);
str.length?
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('')
/**
* @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;
}
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,没有就++,最后对比。
这题目没看懂
/**
* [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');
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'));
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);