您的位置:首页 > Web前端 > JavaScript

关于 最长的子字符串不重复字符 相关js算法问题

2018-03-03 16:35 363 查看
题目 Given 
"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  返回其长度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  自己学习记录
相关文章推荐