关于 最长的子字符串不重复字符 相关js算法问题
2018-03-03 16:35
363 查看
题目 Given
s="wympskqcaibsnutkhtevylciznigkcohccyw";
var l=s.length;
var arr1=[],arr2=[];
分析上述代码 我对JavaScript 只是初步了解 首先了解其中涉及的一些方法
.split('') 将一个字符串分解成字符串数组 s.split('') 将s字符串切割成一个字符一个字符的数组
.reduce(function(total,currentValue,currentIndex,arr),initialValue) .reduce() 数组求和
.indexOf() 查询某个字节是否出现
该题 只是查出字符串中所有不重复的字母 。跟题意所要求的不符合
下边是一个正确的解
4 当tempResult 再一次重复时 与上个连续不重复最长的字符串 相比较,把长的赋值给result
5 则 最后 获得 连续不重复最长的字符串 即为 result 返回其长度
"abcabcbb", the answer is
"abc", which the length is 3.Given
"bbbbb", the answer is
"b", with the length of 1.Given
"pwwkew", the answer is
"wke", with the length of 3. Note that the answer must be a substring,
"pwke"is a subsequence and not a substring.由题可知是求 一个字符串中连续不重复字符的最大长度我的思路<script>
s="wympskqcaibsnutkhtevylciznigkcohccyw";
var l=s.length;
var arr1=[],arr2=[];
1 首先获得1个字符串中全部连续的组合 for(var i=0;i<s.length;i++){ for (var j=0;j<s.length-i;j++){ var sum=''; if (i==0){ sum=s[j]; }else{ for( var m=0;m<=i;m++){ sum=sum+s[j+m]; } } arr1.push(sum); } }
2 函数去重
function arr(arr1) { for(var i = 0; i < arr1.length-1; i++){ for(var j = i+1; j < arr1.length; j++){ if(arr1[i]==arr1[j]){ arr1.splice(j,1);//console.log(arr[j]); j--; } } } } arr(arr1); // 对字符串所有可能去重 console.log(arr1);
3 对字符串中某个字节判断是否重复,并把重复的下标存入arr2 for (var i=0;i<arr1.length;i++){ if (arr1[i].length!=1){ for (var m=0;m<arr1[i].length;m++){ for (var n=0;n<arr1[i].length;n++){ if (arr1[i][m]==arr1[i] &&m!=n){ arr2.push(i); } } } } } console.log(arr1); console.log(arr2); arr(arr2);// 对arr2 去重 console.log(arr2);
4 去除arr1中重复的字符串 for (var i=0;i<arr2.length;i++){ arr1.splice(arr2[i]-i,1); } console.log(arr1); var maxlen=0,j=0;
5 获取arr1中字符的最大长度 for (var i=0;i<arr1.length;i++){ if (arr1[i].length>maxlen){ maxlen=arr1[i].length; j=i; } } console.log(maxlen); console.log(j); console.log(arr1[j]); </script>我的写法 虽然是对的但太麻烦。下边是习题后边优秀的解答
return s.split('').reduce((ret, val, index) => { if(ret.indexOf(val) >= 0) return ret; ret.push(val); return ret; }, []).length;这是一个错误的解答 在s="abcabcbb";时正确。s="pwwkew" 是错误。
分析上述代码 我对JavaScript 只是初步了解 首先了解其中涉及的一些方法
.split('') 将一个字符串分解成字符串数组 s.split('') 将s字符串切割成一个字符一个字符的数组
.reduce(function(total,currentValue,currentIndex,arr),initialValue) .reduce() 数组求和
.indexOf() 查询某个字节是否出现
该题 只是查出字符串中所有不重复的字母 。跟题意所要求的不符合
下边是一个正确的解
var lengthOfLongestSubstring = function(s) { let result = ''; let tempResult = ''; for(let i=0; i<s.length; i++){ if(tempResult.indexOf(s[i]) == -1) { // 当tempResult中不含有s[i]时 tempResult += s[i]; // 所有不重复的字符放入tempResult中 if(tempResult.length > result.length) { //当tempResult的长度大于result的长度时 使result=tempResult result = tempResult; } } else { // 当tempResult中含有s[i]时 if(tempResult.length > result.length) { result = tempResult; } let index = tempResult.indexOf(s[i]); //返回tempResult 重复的位置 tempResult = tempResult.slice(index+1) + s[i]; // 当出现重复字符时对tempResult 重新赋值 从重复的字符之后到结束加上重复的字符 } } return result.length ; };该解逻辑1 从字符串s的第一位开始找第一个连续不重复最长的字符串,命名为tempResult 并把它赋值给result
2 当 s 中出现重复的字符时 将tempResult 从重复字符开始切割并加上重复的字符 并赋值给tempResult 由于这个字符串是切割后的
必然不大于Result
3 从重复位置开始继续添加不重复的字符,组成另一个从重复位置之后的 另一个连续不重复最长的字符 ,每次tempResult增长后都与Result
相比较,并把最长的赋值给Result。
4 当tempResult 再一次重复时 与上个连续不重复最长的字符串 相比较,把长的赋值给result
5 则 最后 获得 连续不重复最长的字符串 即为 result 返回其长度
相关文章推荐
- 关于删除字符串中重复字符问题?解析
- 关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
- 关于FlexPaper 2.1.2版本 二次开发 Logo 、打印、搜索、缩略图、添加按钮、js交互、右键菜单等相关问题
- 算法:字符串字符重复问题
- 关于FlexPaper 2.1.2版本 二次开发 Logo 、打印、搜索、缩略图、添加按钮、js交互、右键菜单等相关问题
- 关于FlexPaper 2.1.2版本 二次开发 Logo 、打印、搜索、缩略图、添加按钮、js交互、右键菜单、书签等相关问题
- 输出字符串中所有最长的无重复字符的子字符串
- 求字符串的不重复字符的最长子串长度的问题
- 3. Longest Substring Without Repeating Characters 无重复字符的最长子字符串
- 关于使用js进行表单提交操作引发的表单重复提交问题
- 2.求最长无重复字符子串和求最长回文子串的算法
- 字符串子串无重复字符最长长度的问题
- 关于js中匹配字符时遇到的问题
- 关于最长不重复子串的问题
- 【算法剖析】求字符串中无重复字符的最长字串
- js创建数组相关以及判断数组元素重复问题
- 亚马逊面试:输出字符串中所有最长的无重复字符的子字符串
- 从字符串中截取最长的没有重复字符的子字符串(一次循环)
- 字符串操作(人民币转成大写/全角字符转半角字符/去掉字符串中重复的子字符串/过滤常见特殊字符/反过滤特殊字符/判断是不是合法手机/字符串匹配的算法)
- js关于字符长度限制的问题示例探讨