2016-07-25 74 views
0

我有字符串(長度50-2000)和潛在的子字符串(長度2-8),它只能在特定位置開始(它可能發生在別處但我不'不在乎)。我需要測試大量的字符串,所以速度是關鍵。有沒有更快的方法則:最快的方法來檢查子字符串是否在另一個字符串的特定位置

var q = baseString.indexOf(searchString, assumedIndex) === assumedIndex; 

var q = baseString.substr(assumedIndex, searchString.length) === searchString; 
+2

你有性能問題? – Amit

+0

我的猜測是第二個更快,因爲它具有運行時'O(m)',其中m是搜索字符串的長度,而第一個具有'O(n)',其中n是基本字符串的長度。而m小於n。儘管這是假設indexOf的簡單實現。此外,這些數字並沒有那麼大的O符號不是真正有效的 –

+0

@JosephYoung沒有更多的細節,你的*猜測*就是這樣一個猜測,它並沒有比任何其他猜測好得多如果你知道現在有97%的字符串匹配機會,那麼你是一樣的嗎?) – Amit

回答

0

銘記什麼阿米特在評論中說,我想我還不如添加一個替代方案,將(可能)至少比快該方法substr

var q = baseString.startsWith(searchString, assumedIndex); 

MDN

startsWith()方法確定字符串是否以另一個字符串的 字符開頭,並根據情況返回truefalse

小例子:

> "Hello world!".startsWith("world!",6) 
< true 

我認爲這可能會更快的原因是,因爲填充工具(如下圖所示)是直接您substr實現什麼,除了瀏覽器實現將本地和可能實現沒有字符串複製。所以它應該至少和你已經建議的一樣快。

填充工具:

if (!String.prototype.startsWith) { 
    String.prototype.startsWith = function(searchString, position){ 
     position = position || 0; 
     return this.substr(position, searchString.length) === searchString; 
    }; 
}