indexOf原理,Java,javascript,python實現
簡介
最近做項目的時候,發現無論是前端還是後端,indexOf出現的概率都非常頻繁,今天我們來看下他的實現原理吧!
indexOf的含義:給定一個字元串去匹配另一個字元串的下標,如果匹配到,返回下標,如果匹配不到則返回-1,其實原理還是比較簡單的,如果需要你實現,那麼應該怎麼做呢?
原理
現在給定匹配的字元串A,原始字元串B,比如匹配字元串A等於「叫練」,原始字元串B等於「邊叫邊練,我喜歡叫練」,你可能一眼就發現「叫練」是最後兩個字元,我們以B做循環,一個一個單詞去匹配,先找「叫」,找到計數器加1,然後繼續找「練」,發現下個字元不是「練」,計數器清零,重新從「叫」開始查找,現在查找到B的倒數第二個字元了,下個字元是「練」計算器再加1,此時計數器等於2也正好是A字元串的長度,說明找到了,查找原理就是這樣一個過程;下面我們分別以Java,javascript,python方式實現下。
注意:下面程式碼沒有校驗,僅供參考,python是index方法,實現原理一樣,但找不到會報錯!
實現
Java實現
public static void main(String[] args) { String orgin = "邊叫邊練,我喜歡叫練"; String serach = "叫練"; int index = indexOf(orgin,serach); System.out.println(index); } /** * indexOf 演算法原理 * @param orgin 原始字元串 B = 「邊叫邊練,我喜歡叫練」; * @param serachString 匹配字元串 A=「叫練」 * @return int 下標 */ public static int indexOf(String orgin,String serachString) { char[] chars = orgin.toCharArray(); char[] sChars = serachString.toCharArray(); //返回字元串下標 int index = -1; //匹配字元串計數器,用於查詢是否匹配到完整字元串 int s_index = 0; //全局計數器,用於計算下標 int move = 0; for (int i=0; i<chars.length; i++) { move++; //如果匹配到「叫」,繼續向下開始匹配「練」 if (chars[i] == sChars[s_index]) { s_index++; if(s_index == sChars.length) { index = move-sChars.length; break; } } else { s_index = 0; } } return index; }
Javascript實現
1 /** 2 * @param orgin 原始字元串 B = 「邊叫邊練,我喜歡叫練」; 3 * @param serachString 匹配字元串 A=「叫練」 4 **/ 5 function indexOf(orgin,serachString) { 6 //返回字元串下標 7 var index = -1; 8 //匹配字元串計數器,用於查詢是否匹配到完整字元串 9 var s_index = 0; 10 //全局計數器,用於計算下標 11 var move = 0; 12 for (var i=0; i<orgin.length; i++) { 13 move++; 14 //如果匹配到「叫」,繼續向下開始匹配「練」 15 if (orgin.substr(i,1) == serachString.substr(s_index,1)) { 16 s_index++; 17 if(s_index == serachString.length) { 18 index = move-serachString.length; 19 break; 20 } 21 } else { 22 s_index = 0; 23 } 24 } 25 return index; 26 }
python實現
1 # indexOf 演算法原理 2 # @param orgin 原始字元串 B = 「邊叫邊練,我喜歡叫練」; 3 # @param serachString 匹配字元串 A=「叫練」 4 # @return int 下標 5 def index(orgin, serachString): 6 # 返回字元串下標 7 index = -1 8 # 匹配字元串計數器,用於查詢是否匹配到完整字元串 9 s_index = 0 10 # 全局計數器,用於計算下標 11 move = 0 12 for letter in enumerate(orgin): 13 move = move + 1 14 # 如果匹配到「叫」,繼續向下開始匹配「練」 15 if letter[1] == serachString[s_index]: 16 s_index = s_index + 1 17 if s_index == len(serachString): 18 index = move - len(serachString) 19 break 20 else: 21 s_index = 0; 22 23 return index

