python,Java,JavaScript實(shí)現(xiàn)indexOf
簡(jiǎn)介
最近做項(xiàng)目的時(shí)候,發(fā)現(xiàn)無(wú)論是前端還是后端,indexOf出現(xiàn)的概率都非常頻繁,今天我們來(lái)看下他的實(shí)現(xiàn)原理吧!
indexOf的含義:給定一個(gè)字符串去匹配另一個(gè)字符串的下標(biāo),如果匹配到,返回下標(biāo),如果匹配不到則返回-1,其實(shí)原理還是比較簡(jiǎn)單的,如果需要你實(shí)現(xiàn),那么應(yīng)該怎么做呢?
原理
現(xiàn)在給定匹配的字符串A,原始字符串B,比如匹配字符串A等于“叫練”,原始字符串B等于“邊叫邊練,我喜歡叫練”,你可能一眼就發(fā)現(xiàn)“叫練”是最后兩個(gè)字符,我們以B做循環(huán),一個(gè)一個(gè)單詞去匹配,先找“叫”,找到計(jì)數(shù)器加1,然后繼續(xù)找“練”,發(fā)現(xiàn)下個(gè)字符不是“練”,計(jì)數(shù)器清零,重新從“叫”開(kāi)始查找,現(xiàn)在查找到B的倒數(shù)第二個(gè)字符了,下個(gè)字符是“練”計(jì)算器再加1,此時(shí)計(jì)數(shù)器等于2也正好是A字符串的長(zhǎng)度,說(shuō)明找到了,查找原理就是這樣一個(gè)過(guò)程;下面我們分別以Java,javascript,python方式實(shí)現(xiàn)下。
注意:下面代碼沒(méi)有校驗(yàn),僅供參考,python是index方法,實(shí)現(xiàn)原理一樣,但找不到會(huì)報(bào)錯(cuò)!
實(shí)現(xiàn)
Java實(shí)現(xiàn)
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 下標(biāo) */ public static int indexOf(String orgin,String serachString) { char[] chars = orgin.toCharArray(); char[] sChars = serachString.toCharArray(); //返回字符串下標(biāo) int index = -1; //匹配字符串計(jì)數(shù)器,用于查詢是否匹配到完整字符串 int s_index = 0; //全局計(jì)數(shù)器,用于計(jì)算下標(biāo) int move = 0; for (int i=0; i<chars.length; i++) { move++; //如果匹配到“叫”,繼續(xù)向下開(kāi)始匹配“練” 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實(shí)現(xiàn)
/** * @param orgin 原始字符串 B = “邊叫邊練,我喜歡叫練”; * @param serachString 匹配字符串 A=“叫練” **/ function indexOf(orgin,serachString) { //返回字符串下標(biāo) var index = -1; //匹配字符串計(jì)數(shù)器,用于查詢是否匹配到完整字符串 var s_index = 0; //全局計(jì)數(shù)器,用于計(jì)算下標(biāo) var move = 0; for (var i=0; i<orgin.length; i++) { move++; //如果匹配到“叫”,繼續(xù)向下開(kāi)始匹配“練” if (orgin.substr(i,1) == serachString.substr(s_index,1)) { s_index++; if(s_index == serachString.length) { index = move-serachString.length; break; } } else { s_index = 0; } } return index; }
python實(shí)現(xiàn)
# indexOf 算法原理 # @param orgin 原始字符串 B = “邊叫邊練,我喜歡叫練”; # @param serachString 匹配字符串 A=“叫練” # @return int 下標(biāo) def index(orgin, serachString): # 返回字符串下標(biāo) index = -1 # 匹配字符串計(jì)數(shù)器,用于查詢是否匹配到完整字符串 s_index = 0 # 全局計(jì)數(shù)器,用于計(jì)算下標(biāo) move = 0 for letter in enumerate(orgin): move = move + 1 # 如果匹配到“叫”,繼續(xù)向下開(kāi)始匹配“練” if letter[1] == serachString[s_index]: s_index = s_index + 1 if s_index == len(serachString): index = move - len(serachString) break else: s_index = 0; return index
以上就是python,Java,JavaScript實(shí)現(xiàn)indexOf的詳細(xì)內(nèi)容,更多關(guān)于indexOf的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
對(duì)python創(chuàng)建及引用動(dòng)態(tài)變量名的示例講解
今天小編就為大家分享一篇對(duì)python創(chuàng)建及引用動(dòng)態(tài)變量名的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Django多數(shù)據(jù)庫(kù)的實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了Django多數(shù)據(jù)庫(kù)的實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python 中的 global 標(biāo)識(shí)對(duì)變量作用域的影響
global 標(biāo)識(shí)用于在函數(shù)內(nèi)部,修改全局變量的值。這篇文章主要介紹了Python 的 global 標(biāo)識(shí)對(duì)變量作用域的影響,需要的朋友可以參考下2019-08-08python 多維切片之冒號(hào)和三個(gè)點(diǎn)的用法介紹
下面小編就為大家分享一篇python 多維切片之冒號(hào)和三個(gè)點(diǎn)的用法介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Python3.6安裝卸載、執(zhí)行命令、執(zhí)行py文件的方法詳解
這篇文章主要介紹了Python3.6之安裝卸載、執(zhí)行命令、執(zhí)行py文件的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02針對(duì)Pandas的總結(jié)以及數(shù)據(jù)讀取_pd.read_csv()的使用詳解
這篇文章主要針對(duì)Pandas總結(jié)以及數(shù)據(jù)讀取_pd.read_csv()的使用詳解做出了實(shí)例,講解非常全面,值得收藏,需要的朋友可以參考下2023-03-03使用Python制作一個(gè)簡(jiǎn)易的遠(yuǎn)控終端
這篇文章主要為大家詳細(xì)介紹了如何使用Python語(yǔ)言制作一個(gè)簡(jiǎn)易的遠(yuǎn)控終端,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下2023-04-04