`
橡树心
  • 浏览: 48211 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

字符串核对(String Match)

 
阅读更多
问题说明:

       现在的一些高级程序语言对于字符串的处理支持越来越大,不过字符串搜寻本身仍是值得探讨的课题,在这里以Boyer Moore法来说明如何进行字符串说明,这个方法速度快且容易理解。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class StringMatch {
    private int[] skip;
    private int p;
    private String str;
    private String key;
    
    public StringMatch(String key) {
        skip = new int[256];
        this.key = key;
        
        for(int k = 0; k <= 255; k++) 
            skip[k] = key.length(); 
        for(int k = 0; k < key.length() - 1; k++) 
            skip[key.charAt(k)] = key.length() - k - 1; 
    }
    
    public void search(String str) {
        this.str = str;
        p = search(key.length()-1, str, key);
    }
    
    private int search(int p, String input, String key) {   
        while(p < input.length()) { 
            String tmp = input.substring(
                                p-key.length()+1, p+1); 

            if(tmp.equals(key))  // 比较两个字符串是否相同 
               return p-key.length()+1; 
            p += skip[input.charAt(p)]; 
        } 

        return -1; 
    }
    
    public boolean hasNext() {
        return (p != -1);
    }
    
    public String next() {
        String tmp = str.substring(p);
        p = search(p+key.length()+1, str, key);
        return tmp;
    }
    
    public static void main(String[] args) 
                                      throws IOException {
        BufferedReader bufReader = 
            new BufferedReader(
                    new InputStreamReader(System.in));
        
        System.out.print("请输入字符串:");
        String str = bufReader.readLine();
        System.out.print("请输入搜寻关键字:"); 
        String key = bufReader.readLine();
        
        StringMatch strMatch = new StringMatch(key);
        strMatch.search(str);

        while(strMatch.hasNext()) { 
            System.out.println(strMatch.next()); 
        } 
    }
}
分享到:
评论
1 楼 namelessmyth 2009-06-27  
太深奥了,纯支持! 

相关推荐

    基于Keil实现字符串函数string.h的简单应用

    基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用...

    305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)

    305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)...

    详解C++ string常用截取字符串方法

    在C++编程中,`std::string`是一个非常重要的数据类型,用于表示和操作字符串。本文将详细解析两种常用的C++ `std::string`截取字符串的方法:`find`和`find_last_of`,以及如何结合使用它们来满足各种字符串处理...

    字符串比对String Compare.rar

    本项目“字符串比对String Compare”提供了一个简易的工具,用于直观地进行字符串的比较。该工具基于.NET Framework 2.0开发,用户在使用时需要注意系统可能需要安装此版本的.NET环境。 字符串比对涉及到的知识点...

    字符串、String类和StringBuilder类

    本文将深入探讨字符串、String类以及StringBuilder类,帮助你更好地理解和应用这些基础知识。 首先,我们关注的是String类。在C#中,String类是不可变的,这意味着一旦一个字符串对象被创建,它的内容就不能被改变...

    C#字符串删除指定字符串|字符串删除子字符串

    在C#编程语言中,处理字符串是常见的任务之一,其中包括删除字符串中的特定部分或子字符串。本篇文章将详细探讨如何在C#中实现这一功能,包括多种方法和实用技巧。 首先,C#提供了多种内置方法来操作字符串,比如`...

    Delphi字符串快速替换函数,速度超快 秒杀自带的StringReplace函数

    内置的`StringReplace`函数虽然提供了基本的替换服务,但在处理大量数据或长字符串时,其性能可能不尽人意。针对这种情况,开发人员经常寻找更高效的替代方案,如在本案例中提到的“Q_Replace.pas”文件所包含的快速...

    pb函数库之字符串操作函数

    其语法为Match(string, textpattern),其中string是指定要检查是否匹配指定模式的字符串,textpattern是指定文本匹配模式。返回值为一个布尔值,如果字符串string与模式textpattern相匹配,则函数返回TRUE,否则返回...

    [字符串]字符串提取(获取两个字符串中间的字符串)

    首先,C#提供了丰富的字符串类(System.String)和正则表达式类(System.Text.RegularExpressions)来帮助我们完成这项工作。在标准的字符串方法中,没有直接提供一个功能可以获取两个已知字符串之间的子串,但我们...

    Android图片Bitmap和字符串String之间的相互转换

    在Android开发中,处理图像数据是一项常见的任务,而Bitmap和String是两个核心的数据类型,分别代表位图图像和文本字符串。Bitmap对象用于存储和显示图像,而String则常用于保存和传输文本信息。本篇文章将深入探讨...

    c#中 base64字符串与普通字符串互转

    总结,C#中的Base64字符串与普通字符串互转是通过`System.Convert`类提供的`ToBase64String`和`FromBase64String`方法实现的。在进行转换时,需要确保对字符串的编码有准确的理解,以便正确地转换和还原。在实际应用...

    TIA博途-字符转换为字符串以及截取字符串有效字符的具体方法示例.docx

    接下来,我们可以使用`CONCAT`函数或`STRING`构造函数将字符数组转换为字符串: ```scl ResultString := CONCAT(CharArray); // 或者 ResultString := STRING(CharArray); ``` 这样,`ResultString`就包含了'ABCDE'...

    将string类型xml字符串转为json字符串

    本篇文章将详细讲解如何将string类型的XML字符串转换为JSON字符串,并介绍相关的技术知识。 首先,理解XML和JSON的基本结构是至关重要的。XML是一种树形结构的标记语言,通过标签来定义元素和属性,例如: ```xml ...

    java字符串之string类创建字符串之使用equals和==判断字符串是否相等.rar

    在Java中,String类是用来创建和操作字符串的。当你需要判断两个字符串是否相等时,可以使用equals()方法和==运算符,但它们的行为是不同的。 使用equals()方法判断字符串是否相等 equals()方法是Object类的一个方法...

    VB拆分字符串,分隔字符串

    在这里,`inputString`是你想要拆分的原始字符串,`delimiter`是用于标识子字符串边界的字符或字符串。例如,如果你有一个逗号分隔的字符串,你可以这样拆分: ```vb Dim str As String = "苹果,香蕉,橙子" Dim ...

    java字符串转String数组简单实例

    java字符串转String数组简单实例,简单但很实用

    Java基础之字符串及String

    在Java编程语言中,字符串(String)是一个至关重要的概念,它是由多个字符按照特定顺序组成的序列。在Java中,字符串被视为对象,主要通过`String`类进行操作。`String`类的实例是不可变的,意味着一旦创建,就不能...

    Swift 中的字符串(String)处理有哪些特点

    在 Swift 中,字符串(String)处理是编程中的基础且关键部分。Swift 的字符串类型是一个强大的、支持多种操作的字符串类,它提供了丰富的API来处理文本数据。以下是 Swift 字符串处理的一些特点: 在实际编程中,...

    c#正则表达式截取指定字符串之间的字符串。类文件直接用就可以了~

    给写了2个方法,一个是直接截取单个需要的字符串,比如字符串string a="ab123456",我只需要提取3,那么就是单独截取就可以了,从2开始到4结束就行。 第二个是把所有的符合条件的字符串都截取出来,提取出来,比如...

    matlab字符串数组string的基础讲解含代码

    对于元胞数组,可以通过`string(A)`将字符向量元胞数组转换为字符串数组,如示例所示。 总的来说,MATLAB的字符串数组提供了一种灵活且强大的方式来处理文本数据,允许进行丰富的文本分析和操作,与MATLAB的数值...

Global site tag (gtag.js) - Google Analytics