`
橡树心
  • 浏览: 47836 次
  • 性别: 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仿真和代码)...

    最新单片机仿真 字符串函数string.h应用举例

    最新单片机仿真 字符串函数string.h应用举例最新单片机仿真 字符串函数string.h应用举例最新单片机仿真 字符串函数string.h应用举例最新单片机仿真 字符串函数string.h应用举例最新单片机仿真 字符串函数string.h...

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

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

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

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

    c字符串,string对象,字符串字面值的区别详解

    在C++中,我们通常会遇到三种主要的字符串形式:C字符串,string对象,以及字符串字面值。这些字符串形式各有特点,适用场景不同,理解它们之间的差异对于编写高效、安全的代码至关重要。 一、字符串字面值 字符串...

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

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

    字符串数组转换成string类型的

    在编程领域,尤其是在使用C++、Java或C#等面向对象的语言时,经常需要将字符串数组转换为单一的string类型。这种操作在处理数据输入、输出或者格式化时非常常见。下面我们将详细讨论如何在不同语言中实现这个过程,...

    单片机C语言源码学习参考-字符串函数string.h应用举例.zip

    本资料包"单片机C语言源码学习参考-字符串函数string.h应用举例.zip"聚焦于C语言中的字符串处理,重点讲解了如何利用标准库`string.h`中的函数来操作和管理字符串。下面我们将深入探讨`string.h`库中的关键函数及其...

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

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

    JS中判断某个字符串是否包含另一个字符串的五种方法

    String对象的方法 方法一: indexOf() (推荐) var str = "123" console.log(str.indexOf("2") !...match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。 方法三: search()

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

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

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

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

    Java基础之字符串及String

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

    键盘输入两个字符串,相同显示MATCH,不同显示NOMATCH

    在键盘输入两个字符串,相同显示MATCH,不同显示NOMATCH

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

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

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

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

    Arduino 分割字符串库,strFenGe.rar

    1. **Arduino String 类**: Arduino IDE 提供了一个名为 `String` 的类,它允许我们创建、操作和管理字符串。`String` 类提供了许多方法,如 `concat()`, `substring()`, `indexOf()`, `charAt()` 等,用于对字符串...

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

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

    !实例研究:字符串类String.rar_字符串类_类String重载

    在C++编程语言中,`std::string`是用于处理字符串的重要类,它提供了丰富的功能,包括字符串的创建、操作和管理。在这个实例研究中,我们聚焦于`std::string`类的一个关键特性:重载操作符`+=`,这个操作符用于连接...

Global site tag (gtag.js) - Google Analytics