编写一个JavaScript函数来查找给定字符串中的最长子字符串,而不重复字符

时间:2018-03-01 19:18:14

标签: javascript

"编写一个JavaScript函数来查找给定字符串中的最长子字符串,而不重复字符。"

这是我尝试过的,但它没有打印任何东西

function sort(names) {
  let string = "";
  let namestring = names.split("");

  for(let i = 0; i < namestring.length; i++) {
    for(let j = 0; j < string.length; j++) {
      if(string[j] != namestring[i]) {
        string = string + namestring[i];
      } 
    }
  }

  return string;
}

console.log(sort("google.com"));

出了什么问题?

3 个答案:

答案 0 :(得分:0)

&#13;
&#13;
function sort(names)
{
    string="";
    ss="";
    namestring=names.split("");

    for(j=0;j<namestring.length;j++) {
        for(i=j;i<namestring.length;i++) {
            if(string.includes(namestring[i]))
                break;
            else
                string+=namestring[i];
         }
         if(ss.length<string.length)
             ss=string;
         string="";
    }
    return ss;
}
console.log(sort("google.com"));
&#13;
&#13;
&#13;

它的o(n ^ 2)复杂度,但尝试这个(如果包含函数采用o(n)复杂度,可能是o(n ^ 3)

function sort(names)
{
    string="";
    ss="";
    namestring=names.split("");

    for(j=0;j<namestring.length;j++) {
        for(i=j;i<namestring.length;i++) {
            if(string.includes(namestring[i])) // if contains not work then  
                break;                         //use includes like in snippet
            else
                string+=namestring[i];
         }
         if(ss.length<string.length)
             ss=string;
         string="";
    }
    return ss;
}
console.log(sort("google.com"));

答案 1 :(得分:0)

你有什么期望答案在这里?应该是“ogle.com”还是“gle.com”?如果第一个,下面应该到达那里,如果是后者,请将else中的tests = name.charAt(i)更新为tests =“”。

所以需要注意的一些事情,尽管你们非常欢迎你们这样做:

1)功能名称。据我所知,这不是“排序”,所以如果这是为了你的使用(或任何重用。基本上,除了一个家庭作业之外的任何东西),你可能想要将它重命名为你的' d实际上记得(即使我给出的例子可能不完全是最好的,因为“选择最长子串”是非描述性标准)。

2)变量命名。 string和namestring在这里对你来说意味着什么,但考虑到我们试图找到一个字符串中最长的子字符串(没有双字符),我觉得最好有一个我们正在检查(测试)和我们存储的那个以后返回(最长)。当您阅读完成后使用已检查的字符串(已测试)时,如果您正在阅读代码时有所帮助,您想比较它是否大于当前最长子字符串(最长)并且如果它更大,则希望它成为新的最长的。这将为你节省大量头痛,将变量命名为在设计函数时有用的东西,因为你可以尽可能接近要求而不试图做某种形式的替换,或者更糟糕的是,忘记哪个变量保持什么

如果测试长度与最长长度相同,我不知道你想要的结果是什么。目前我已设置保留,如果您想要最新,请将检查更新为&gt; =。

除此之外,我只是迭代字符串,设置为当前测试的字符串。一旦满足双字符,我就会看到我刚刚生成(测试)的内容是否大于当前最长的字符,如果是,则现在是最长的。一旦我完成了对字符串的循环,我必须再次执行当前vs最长的检查/设置,否则,它会使最终测试无意义(它会在另一个双字符情况被击中之前进入循环之外)。

function pickLongestSubstring(name) {
       let tested = "";
       let longest = "";
  
       for (let i = 0; i < name.length; i++) {
         if (tested.length == 0 || tested.charAt(tested.length - 1) != name.charAt(i)) {
           tested += name.charAt(i);
         }
         else {
           if (tested.length > longest.length) {
             longest = tested;
             tested = "";
           }
         }
       }

       if (tested.length > longest.length) {
         longest = tested;
       }

       return longest;
    }
    console.log(pickLongestSubstring("google.com"))
    console.log(pickLongestSubstring("example.com"))

答案 2 :(得分:0)

这是一个递归循环,应该获得最长的字符串。使用sort来确定最长的字符串。即使多个相同的重复char实例也可以工作。

function longestWithoutRepeat(testString, returnString){
  var returnString = returnString || "";
  for(var i = 0; i < testString.length; i++) {
    if(i > 0){
      if(testString[i] == testString[i-1]) {
        var testStringArray = testString.split(testString[i] + testString[i-1]);
        
        testStringArray.sort(function(firstString, nextString){ return nextString.length - firstString.length})
        
        returnString = testStringArray[0];
        longestWithoutRepeat(testStringArray[0], returnString);
      }
    } else {
      returnString = testString
    }
  }
  return returnString;
}

console.log(longestWithoutRepeat("oolong"));
console.log(longestWithoutRepeat("google.com"));
console.log(longestWithoutRepeat("diddlyougotoofarout"));