• 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
  • 相关阅读:
    【部分原创】标准C语言的优先级、结合性、求值顺序、未定义行为和非确定行为浅析
    &&、||、?:、,四个运算符的求值顺序
    [转]说说C语言运算符的“优先级”与“结合性”
    初识Nginx,简单配置实现负载均衡(ubuntu + Nginx + tomcat)
    Hadoop伪分布式模式安装
    HBase hbase-site.xml 参数
    HBase单机环境搭建
    Hadoop单机模式安装
    JAVA笔记整理(一),JAVA介绍
    JAVA笔记整理(十),JAVA中的File
  • 原文地址:https://www.cnblogs.com/jiaolian/p/13634563.html
Copyright © 2020-2023  润新知