`
leichenlei
  • 浏览: 128808 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

模式匹配(indexOf)

阅读更多

简单串模式匹配算法

 

package com.test;


public class Test {
	/**
	 * 一个普通的模式匹配算法
	 * @param str 主串
	 * @param sub 模式串
	 * @param pos 位置
	 * @return 模式串的匹配的首个开始位置
	 */
	public static int indexOf1(String str, String sub, int pos){
		int i = pos;
		int j= 0;
		while(i < str.length() && j < sub.length()){
			if(str.charAt(i) == sub.charAt(j)){
				++i;
				++j;
			}else{
				i = i - j + 1;// j刚好可以记录i先前走了几步,利用j可以回溯指针i。
				j= 0;
			}
		}
		if(j == sub.length()){// 匹配的话,j刚好=sub最后下标+1(sub长度)
			return i - sub.length();
		}
		return -1;
	}
	/**
	 * /java indexOf源码算法,进行了命名改动和变量简化
	 * 一个普通的模式匹配算法
	 * @param str 主串
	 * @param sub 模式串
	 * @param pos 位置
	 * @return 模式串的匹配的首个开始位置
	 */
	public static int indexOf2(String str, String sub, int pos){
		int strLen = str.length();
		int subLen = sub.length();
		//两个边界处理
		if (pos >= strLen) {
            return (subLen == 0 ? strLen : -1);
		}
    	if (pos < 0) {
    	    pos = 0;
    	}
    	//特殊值处理
    	if (subLen == 0) {
    		return pos;
    	}
        char first  = sub.charAt(0);//模式串第一个字符
        int max = strLen - subLen;//母串不必匹配到最后一个字符

        for (int i = pos; i <= max; i++) {
            /* 查找第一个字符 */
            if (str.charAt(i) != first) {
                while (++i <= max && str.charAt(i) != first);
            }
            
            /* 找到第一个字符,现在找模式串的第二个字符 */
            if (i <= max) {
                int j = i + 1;
                int end = j + subLen - 1;
                for (int k = 1; j < end && str.charAt(j) == sub.charAt(k); j++, k++);
                if (j == end) {
                    /* 找到了整个串 */
                    return i;
                }
            }
        }
        return -1;
	}

	public static void main(String[] args) {
		System.out.println(indexOf1("ababbabacc", "bb", 0));
		System.out.println(indexOf2("ababbabacc", "bb", 0));
	}
}

 

分享到:
评论

相关推荐

    js中indexOf与search的区别.docx

    - 可以接受正则表达式作为参数,使其能够进行更复杂的模式匹配。 #### 四、indexOf与search的区别 1. **参数类型:** - `indexOf()`方法只接受字符串作为参数。 - `search()`方法可以接受正则表达式或字符串作为...

    js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解

    本文将详细介绍JavaScript中一些常用字符串方法的用法,包括 substr、substring、indexOf、lastIndexOf、split 和 replace。通过这些方法,可以轻松地对字符串进行提取、分割和替换操作。 首先,让我们来看看 ...

    基于js 字符串indexof与search方法的区别(详解)

    2. **匹配规则**:`indexOf`简单地查找子字符串,不支持模式匹配;`search`则支持正则表达式的复杂匹配。 3. **大小写敏感性**:`indexOf`对大小写敏感,而`search`可以配合正则表达式的`i`标志实现大小写不敏感。 4...

    js中indexof的用法详细解析

    正则表达式提供了更丰富的匹配规则,包括全局搜索、模式匹配等。 总结,`indexOf` 是 JavaScript 中一个非常实用的方法,用于查找子字符串或字符在原字符串中的位置。通过灵活运用,可以解决许多字符串处理问题。...

    java模式匹配之蛮力匹配

    在计算机科学中,模式匹配是一项重要的字符串处理任务,用于在目标字符串中查找是否存在某个特定的子字符串。本文主要讨论的是Java中实现模式匹配的一种简单方法——蛮力匹配(Brute-Force Matching)。这种算法的...

    javascript正则匹配页面关键字

    - **模式匹配**:模式由元字符和量词组成,如`.`表示任意字符,`\w`代表单词字符,`\d`代表数字,`*`表示前面的元素零次或多次,`+`表示一次或多次,`?`表示零次或一次。 - **标志符**:如`g`全局匹配,`i`忽略大...

    Qt做的字符串匹配程序源代码

    QByteArray适用于二进制数据,而QString更适合处理文本字符串,它们都提供了丰富的操作函数,如indexOf()用于查找子串,方便我们实现字符串匹配。 在程序设计上,可以创建一个基类StringMatcher,然后分别为每个...

    字符串、字符和正则表达式

    C#提供了丰富的字符串方法,如`Substring`用于获取子字符串,`IndexOf`和`LastIndexOf`用于查找子串的位置,`Replace`用于替换子串,以及`Trim`和`ToLower`等用于去除空白字符和转换大小写。然而,需要注意的是,...

    Prototype源码浅析 String部分(一)之有关indexOf优化

    include方法检查字符串中是否包含某个模式,使用indexOf方法来实现。startsWith和endsWith方法分别用于判断字符串是否以特定模式开始或结束。empty方法用于判断字符串是否为空,而blank方法则检查字符串是否全为空白...

    Index of the Bash Command Lin for Linux

    6. **awk**:强大的文本处理工具,可进行模式匹配、替换和数据分析。 7. **basename**:从文件路径中提取文件名,去除目录和扩展名。 8. **bash**:GNU Bourne-Again SHell,Linux的标准命令行解释器。 9. **bc**:...

    华为-华为od题库练习题之字符串字符匹配.zip

    7. 编程语言特性:熟悉各种编程语言中的字符串处理函数,如C++的std::string::find,Java的String.indexOf,Python的str.find等。 8. 动态规划:在某些特殊情况下,字符串匹配问题可以通过动态规划方法解决,例如...

    JavaScript使用indexOf获得子字符串在字符串中位置的方法

    2. 部分匹配:IndexOf将返回子字符串首次出现的完整匹配位置,而不是部分匹配位置。 3. 空字符串:如果搜索的值是空字符串(""),IndexOf将返回起始位置0。 4. 负索引:从后向前搜索时,如果fromindex为负值,实际...

    C#做的字符串查找,字符串长度计算和字符定位,匹配上的字符显红色

    综上所述,C#提供了一系列的字符串处理方法,包括基本的查找、长度计算和字符定位,以及通过正则表达式进行复杂的模式匹配。这些功能使得开发者能够高效地处理和分析字符串数据,同时通过UI反馈给用户,比如通过改变...

    Dic.zip_Dic.txt_dic_匹配字典

    在实现这个最大正向匹配算法时,Java程序员可能会使用字符串类的方法,如indexOf()或contains(),或者自定义更高效的搜索结构,如Trie树(字典树)。Trie树是一种前缀树,特别适合于存储和查询字符串,可以快速地...

    Flex中Array的IndexOf 的作用示例介绍

    1. 只传递需要查找的元素,IndexOf就会从数组的起始位置开始查找,返回第一个匹配元素的索引。 2. 传递两个参数:第一个是要查找的元素,第二个是开始查找的位置(指定为数字索引),这样IndexOf就会从指定位置开始...

    JAVA两个字符串比较匹配字数.docx

    在Java编程中,比较两个字符串的匹配字数是一项常见的任务,尤其是在文本处理或模式匹配的场景下。以下是一个简单的实现,通过`RangeDifferencer4Bak`类来完成这个功能。这个类有两个主要方法:`getTempModel`和`...

    假如正则从来没来过,我们该如何去匹配一个字符串

    在Java中,虽然没有内置的正则表达式库,但可以编写基于`String`类的方法链来实现类似功能,比如`indexOf()`、`contains()`等。 不过,以上所有方法的灵活性和通用性都无法与正则表达式相比。正则表达式通过组合...

    java实现关于字符串的符号匹配帮助类

    4. **customPatternMatch(String input, char[] pattern)**:如果需要实现自定义的模式匹配,可以创建一个方法,使用栈(如`Stack.java`文件所示)来存储和检查字符序列。例如,检查输入字符串是否符合括号平衡: ``...

    C# String 查找

    本文主要介绍C#中利用`IndexOf()`方法以及其他几种方法来查找匹配的数据。 #### `IndexOf()` 方法 `IndexOf()` 是一个非常常用的方法,用于确定指定子字符串是否存在于当前字符串中,并返回该子字符串首次出现的...

Global site tag (gtag.js) - Google Analytics