2017-03-24 172 views
-2

問題提示「給定一個字符串,找到最長的非重複子串而不重複字符」。例如,爲什麼返回我的代碼不適用於字符串「dvdf」,我有點難過。以下是我的代碼:最長子串非重複字符javascript

function lengthOfLongestSubstring(check) { 
    var letters = check.split(""); 
    var max = 0; 
    var result = []; 
    for (var i = 0; i < letters.length; i++) { 
     var start = i 
     if (result.indexOf(letters[i]) === -1) { 
      result.push(letters[i]) 
     } else { 
      i = i - 1 
      result = [] 
     } 
     if (max === 0 || max < result.length) { 
      max = result.length 
     } 
    } 
    return max 
} 
+0

它重新爲我轉動'2'。我認爲這是正確的。你的實現雖然看起來不正確。 – Halcyon

+0

@Halcyon「dvdf」中獨特字符的最長序列是「vdf」,長度爲3 –

回答

0

該實施給出"dvdf"的正確結果。

它將字符添加到current_string而沒有重複。當你找到重複剪切current_string到重複點。 max是最大長度current_string在任何時間。這個邏輯對我來說似乎是正確的,所以我認爲這是正確的。

function lengthOfLongestSubstring(string) { 
    var max = 0, current_string = "", i, char, pos; 

    for (i = 0; i < string.length; i += 1) { 
     char = string.charAt(i); 
     pos = current_string.indexOf(char); 
     if (pos !== -1) { 
      // cut "dv" to "v" when you see another "d" 
      current_string = current_string.substr(pos + 1); 
     } 
     current_string += char; 
     max = Math.max(max, current_string.length); 
    } 
    return max; 
} 

lengthOfLongestSubstring("dvdf"); // 3 

current_string在每一輪的值是"", "d", "dv", "vd", "vdf"

0

將i重置爲i -1不正確。您需要for循環內的另一個循環。你嘗試這樣的事情(我沒有仔細檢查索引)。

function lengthOfLongestSubstring(check){ 
    var letters = check.split(""); 
    var max = 0; 
    for (var i = 0; i < letters.length; i++) { 
     var result = []; 
     var j = i; 
     for(;j < letters.length; j++) { 
      if (result.indexOf(letters[j]) === -1) { 
       result.push(letters[j]); 
      } else { 
       break; 
      }   
     } 
     if(j - i > max) { 
      max = j - i; 
     } 
    } 
    return max; 
} 
+0

您的實現提供了'dvdf = 2'。我應該是3.我不明白爲什麼你需要第二個循環。 – Halcyon

+0

@Halcyon在我的原始代碼中有一個錯誤。檢查max應該在第二個for循環之外完成,而不是在循環之內。當然你不需要第二個循環,但它是查找最長子串的一種方法。 – Shiping

0

通過用存儲每個遇到字符的最後一個索引的映射替換result數組,您可以修改循環體以在相同字符的最後一個索引之後跳回到一個,並繼續從那裏搜索而不是重新啓動從經由目前i = i - 1的當前位置,其失敗的情況下,如'dvdf'

下面是與變化的代碼,以適應地圖代替陣列:

function lengthOfLongestSubstring(check) { 
 
    var letters = check.split(""); 
 
    var max = 0; 
 
    var result = new Map(); 
 
    var start = 0; 
 
    
 
    for (var i = 0; i < letters.length; i++) { 
 
    if (!result.has(letters[i])) { 
 
     result.set(letters[i], i); 
 
    } else { 
 
     i = result.get(letters[i]); 
 
     result.clear(); 
 
    } 
 
    
 
    if (max < result.size) { 
 
     max = result.size; 
 
    } 
 
    } 
 
    return max; 
 
} 
 

 
// Example: 
 
console.log(lengthOfLongestSubstring("dvdf")); // 3