zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Codevs 2296 仪仗队 2008年省队选拔赛山东
    Codevs 1535 封锁阳光大学
    Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组
    Codevs 1218 疫情控制 2012年NOIP全国联赛提高组
    Codevs 1684 垃圾陷阱
    洛谷 P1108 低价购买
    Vijos P1325桐桐的糖果计划
    Codevs 3289 花匠 2013年NOIP全国联赛提高组
    Codevs 2611 观光旅游(floyed最小环)
    C语言基础之彩色版C语言(内含linux)
  • 原文地址:https://www.cnblogs.com/jiaolian/p/13634563.html
Copyright © 2011-2022 走看看