算法练习之从String.indexOf的模拟实现开始

String.indexOf的模拟实现,没想象中有多么高深的查找算法,就是最普通的遍历查找

思路:先找到第一个相同的字符,然后依次比较后面的字符,若都相等则表示查找成功

/**
   * 查找字符串pattern在str中第一次出现的位置
   * @param str
   * @param pattern
   * @return
   */
  public int firstIndexOf(String str, String pattern) {
    for (int i = 0; i < (str.length() - pattern.length()); i++) {
      int j = 0;
      while (j < pattern.length()) {
        if (str.charAt(i + j) != pattern.charAt(j)) break;
        j++;
      }
      if(j==pattern.length()) return i;
    }
    return -1;
  } 

  /**
   * 查找字符串pattern在str中最后一次出现的位置
   * @param str
   * @param pattern
   * @return
   */
  public int lastIndexOf(String str, String pattern) {
    for (int i = str.length() - pattern.length(); i >= 0; i--) {
      int j = 0;
      while (j < pattern.length()) {
        if (str.charAt(i + j) != pattern.charAt(j)) break;
        j++;
      }
      if (j == pattern.length()) return i;
    }
    return -1;
  } 

  /**
   * 查找字符串pattern在str中出现的位置
   * @param str
   * @param pattern
   * @return
   */
  public List<Integer> indexOf(String str, String pattern) {
    List<Integer> indexs = new ArrayList<Integer>();
    for (int i = 0; i < (str.length() - pattern.length()); i++) {
      int j = 0;
      while (j < pattern.length()) {
        if (str.charAt(i + j) != pattern.charAt(j)) break;
        j++;
      }
      if (j == pattern.length()) indexs.add(i);
    }
    return indexs;
  } 

同样更常用的String.contains方法实际上就是调用的String.indexOf实现

/**
   * 判断字符串pattern在str中是否存在
   * @param str
   * @param pattern
   * @return
   */
  public boolean contains(String str, String pattern) {
    return firstIndexOf(str, pattern) != -1;
  } 
(0)

相关推荐

  • 算法练习之从String.indexOf的模拟实现开始

    String.indexOf的模拟实现,没想象中有多么高深的查找算法,就是最普通的遍历查找 思路:先找到第一个相同的字符,然后依次比较后面的字符,若都相等则表示查找成功 /** * 查找字符串pattern在str中第一次出现的位置 * @param str * @param pattern * @return */ public int firstIndexOf(String str, String pattern) { for (int i = 0; i < (str.length() -

  • C++string底层框架模拟实现代码

    目录 一. 前言 二. 浅拷贝与深拷贝优缺点 1. 浅拷贝 2. 深拷贝 3. 深拷贝现代版 4. 写时拷贝 三. string框架搭建 1. 框架定义 2. 构造函数 3. 析构函数 4. 赋值重载 5. 实现扩容 6. 增添数据 7. 删除数据 8. 数据查找 9. iterator迭代器 10. 插入/提取流与getline函数 四. 完整代码 一. 前言 本节文章主要说明浅拷贝和深拷贝的优缺点,以及仿写string类的逻辑并分析实现过程 如果人对一个事物感兴趣,总是那么好奇,就会刨根问底

  • C++ String部分成员模拟实现流程详解

    目录 string类的成员设计 普通构造函数的模拟 拷贝构造函数的模拟 赋值重载函数的模拟 String的析构函数模拟 补全上述的成员函数 迭代器的简单模拟 其他成员函数的模拟 string类的成员设计 class string { private: char* _str; int _size; int _capacity; }; 说明:以下的五个成员函数的模拟实现,均去除了_size 和_capacity成员变量,目的是为了更方便解释重点.在五个成员函数模拟后,会对string类的设计进行补全

  • .net indexOf(String.indexOf 方法)

    返回 String 对象内第一次出现子字符串的字符位置. public indexOf(value:String, [startIndex:Number]) : Number 搜索字符串,并返回在调用字符串内 startIndex 位置上或之后找到的 value 的第一个匹配项的位置.此索引从零开始,这意味着字符串中的第一个字符被视为位于索引 0 而不是索引 1 处.如果未找到 value,该方法会返回 -1. 参数 value:String - 一个字符串:要搜索的子字符串. startInd

  • String.indexOf 方法介绍

    字符串的IndexOf()方法搜索在该字符串上是否出现了作为参数传递的字符串,如果找到字符串,则返回字符的起始位置 (0表示第一个字符,1表示第二个字符依此类推)如果说没有找到则返回 -1 返回 String 对象内第一次出现子字符串的字符位置. 复制代码 代码如下: public indexOf(value:String, [startIndex:Number]) : Number 搜索字符串,并返回在调用字符串内 startIndex 位置上或之后找到的 value 的第一个匹配项的位置.此

  • Javascript类型系统之String字符串类型详解

    javascript没有表示单个字符的字符型,只有字符串String类型,字符型相当于仅包含一个字符的字符串 字符串String是javascript基本数据类型,同时javascript也支持String对象,它是一个原始值的包装对象.在需要时,javascript会自动在原始形式和对象形式之间转换.本文将介绍字符串String原始类型及String包装对象 定义 字符串String类型是由引号括起来的一组由16位Unicode字符组成的字符序列 字符串类型常被用于表示文本数据,此时字符串中的

  • C++实现的大数相乘算法示例

    本文实例讲述了C++实现的大数相乘算法.分享给大家供大家参考,具体如下: 昨晚校招笔试,虐的没脸睡觉,能力太渣了,但我还在码农的坑里前行,希望早日跳坑,解决衣食住行之忧. 大数相乘,是指那些相乘结果或是乘数本身用long long类型都会溢出的数字,通常这些数字都通过string类型进行表示,借助于可动态调整大小的数据结构(vector,string,deque)模拟实现数字的乘法操作.对于普通的乘法,我们知道m位数和n位数相乘,最后的结果位数在区间内[m+n-1,m+n].例如34*56,我们

  • C#中的char、string和StringBuilder的使用详解

    char 字符 char代表一个Unicode字符,它是System.Char的别名 char someChar = 'a';//定义了一个字符 char newLine= '\n';//这是一个换行符 System.Char定义了一组静态方法: ToUpper 将指定的字符转换为等效的大写形式 ToLower 将指定的字符转换为等效的小写形式 IsWhiteSpace 判断指定的字符是否为空白字符 -- 例子: Console.WriteLine(char.ToUpper('c'));//输出

  • C++ OpenCV模拟实现微信跳一跳

    目录 前提精要: 实机演示Gif: 思路: 获取小黑人的位置: 获取终点的位置: 需要自定义的: 完整项目: 项目结构 pch.h main.cpp  前提精要: 本程序参考了大量的大佬佬的代码,在此基础之上,改编而成.而且其实代码写的奇差无比,很容易就挂了.然后呢,这里只是稍微提供一些思路,作为参考,就酱. 本程序依赖adb.exe和opencv425库. 本程序还有待优化,很渣很糟糕~ 仅供学习交流使用,切勿使用在违规违法的环境之中. 实机演示Gif: 思路: 获取小黑人的位置,获得目标方块

  • javascript中indexOf技术详解

    JavaScript提供了几种技术,来在字符串中搜索一个单词.数字或其他的一串字符.搜索可能很方便,例如,如果你想要知道访问者使用哪种Web浏览器来浏览你的站点.每个Web浏览器在一个字符串中标识关于自己的信息,该字符串包含了很多不同的统计数据.可以通过在一个Web页面中添加下面这段JavaScript,并且在Web浏览器预览,从而看到这个字符串: <script> alert(navigator.userAgent): </script> Navigator是一个Web浏览器对象

随机推荐