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;
            }
            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                 }
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

[] ) [](top

原文创作:叫练

原文链接:https://www.cnblogs.com/jiaolian/p/13634563.html

文章列表

更多推荐

更多
  • Azure上Linux管理-十、使用 Azure Kubernetes 服务 技术要求,开始使用 AKS,与 Helm 一起工作,使用草稿,管理 Kubernetes,问题,进一步,使用 WSL 和 VS Code,安装依赖,kubectl 安装,使用 Azure CLI 创建集群,AKS 首次部署,创建服务,多
    Apache CN

  • Azure上Linux管理-十一、故障排除和监控您的工作负载 module(load="imuxsock"),技术要求,访问您的系统,Azure 日志分析,性能监控,问题,进一步,不允许远程访问,正在端口上工作,使用 nftables,引导诊断,Linux 登录,配置日志分析服务,安装 Azure
    Apache CN

  • Azure上Linux管理-十二、附录 第一章:探索微软 Azure 云,第二章:Azure 云入门,第三章:Linux 基础管理,第 4 章:管理 Azure,第五章:高级 Linux 管理,第七章:部署虚拟机,第八章:探索连续配置自动化,第 9 章:Azure 中的容器虚
    Apache CN

  • Azure上Linux管理-九、Azure 中的容器虚拟化 cloudconfig,集装箱技术导论,系统生成,Docker,Azure 容器实例,Buildah, Podman, and Skopeo,容器和储存,问题,进一步,容器历史,chroot 环境,OpenVZ,LXC,创建一个带启动的
    Apache CN

  • Azure上Linux管理-七、部署你的虚拟机 ResourceGroup 不存在,创建它:,vnet 不存在,创建 vnet,cloudconfig,Vagrant.config 结束,部署场景,Azure 中的自动部署选项,初始配置,流浪,封隔器,自定义虚拟机和 vhd,问题,进
    Apache CN

  • Azure上Linux管理-八、探索持续配置自动化 了解配置管理,使用 Ansible,使用地球形态,使用 PowerShell DSC,Azure 策略客户端配置,其他解决方案,问题,进一步,技术要求,Ansible 的安装,SSH 配置,裸最小配置,库存文件,Ansible 剧本和模
    Apache CN

  • Azure上Linux管理-五、高级 Linux 管理 技术要求,软件管理,网络,存储,systemd,问题,进一步,RPM 软件管理器,YUM 软件管理,基于 DNF 的软件管理,DPKG 软件管理器,运用 apt 进行软件管理,ZYpp 软件管理,识别网络接口,IP 地址识别,显示路由表
    Apache CN

  • Azure上Linux管理-六、管理 Linux 安全与身份 SELINUX=可以接受以下三个值之一:,permissiveSELinux 打印警告而不是强制执行。,disabled 没有加载 SELinux 策略。,SELINUXTYPE=可以接受以下三个值之一:,targeted 目标进程
    Apache CN

  • Azure上Linux管理-四、管理 Azure 使用 Azure CLI 和 PowerShell 管理 Azure 资源,技术要求,管理存储资源,管理网络资源,管理计算资源,虚拟机资源,问题,进一步,存储帐户,托管磁盘,Azure 文件,Azure Blob,虚拟网络,子网,网络安
    Apache CN

  • Azure上Linux管理-三、Linux 基础管理 Linux Shell,获取帮助,使用文本文件,在文件系统中找到你的方式,流程管理,自由访问控制,问题,执行命令,命令行编辑,与历史一起工作,自动完成,球状,重定向,处理变量,Bash 配置文件,使用手册页,使用信息文档,其他文档,文本
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多