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

 更新时间:2014年12月25日 14:24:28   投稿:mdxy-dxy  
这篇文章主要介绍了算法练习从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; 
  } 

相关文章

  • 大家应该掌握的多线程编程

    大家应该掌握的多线程编程

    这篇文章主要介绍了大家应该掌握的多线程编程,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • C# 实现TXT文档转Table的示例代码

    C# 实现TXT文档转Table的示例代码

    这篇文章主要介绍了C# 实现TXT文档转Table的示例代码,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-12-12
  • C#日期时间类的使用方法(DateTime类、TimeSpan类与DateTimeOffset类)

    C#日期时间类的使用方法(DateTime类、TimeSpan类与DateTimeOffset类)

    在C#中我们常使用到关于时间的相关操作,这篇文章主要给大家介绍了关于C#日期时间类的使用方法,文中介绍的方法分别包括DateTime类、TimeSpan类与DateTimeOffset类的相关资料,需要的朋友可以参考下
    2023-11-11
  • C#使用LOCK实现线程同步

    C#使用LOCK实现线程同步

    这篇文章介绍了C#使用LOCK实现线程同步的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法

    C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法

    这篇文章主要介绍了C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法,结合实例形式分析了WinForm图片重叠后造成图片不透明的原因与相应的解决方法,需要的朋友可以参考下
    2016-06-06
  • 在C#中使用指针的示例代码

    在C#中使用指针的示例代码

    C#向开发人员隐藏了大部分基本内存管理操作,因为它使用了垃圾回收器和引用,但是,有时候我们也需要直接访问内存,例如:进行平台调用,性能优化等等,本文给大家介绍了在C#中使用指针的示例代码,需要的朋友可以参考下
    2024-10-10
  • Unity实现简单摇杆的制作

    Unity实现简单摇杆的制作

    这篇文章主要为大家详细介绍了Unity实现简单摇杆的制作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C#获取DICOM图像像素的像素值的代码详解

    C#获取DICOM图像像素的像素值的代码详解

    DICOM即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052),它定义了质量能满足临床需要的可用于数据交换的医学图像格式,这篇文章主要介绍了C#获取DICOM图像像素的像素值的方法,需要的朋友可以参考下
    2024-07-07
  • C#使用List类实现动态变长数组的方法

    C#使用List类实现动态变长数组的方法

    这篇文章主要介绍了C#使用List类实现动态变长数组的方法,涉及C#中List类的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C# CheckedListBox控件的用法总结

    C# CheckedListBox控件的用法总结

    本篇文章主要介绍了C# CheckedListBox控件的用法总结,想要学习CheckedListBox的同学可以了解一下。
    2016-12-12

最新评论