`
leichenlei
  • 浏览: 124202 次
  • 性别: 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));
	}
}

 

分享到:
评论

相关推荐

    字符串匹配(上)

    BF算法 Brute Force,暴力匹配算法/朴素匹配算法 相关概念 ...String.prototype.indexOf = function (pattern) { let str = this let index = -1 for (let i = 0; i &lt; str.length - pattern.length

    freemarker总结

    item_index:当前变量的索引值 item_has_next:是否存在下一个对象 也可以使用指令跳出迭代 例子如下: ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x&gt; ${x_index + 1}.${x}, ...

    java 正则表达式

    屏蔽关键字(sex , fuck) - 已修改&lt;script language="JavaScript1.2"&gt;function test() {if((a.b.value.indexOf ("sex") == 0)||(a.b.value.indexOf ("fuck") == 0)){ alert("五讲四美三热爱"); a.b.focus(); return ...

    正则表达式

    JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. 在JavaScript中,正则表达式是由一个RegExp对象表示的.当然,可以使用一个RegExp()构造函数来创建RegExp...

    SimpsonsQuoteBot:Discord bot 将在 Frinkiac 上查找报价

    一般来说,最好使用查询的一部分,因为 Homer 使用Match.Subtitle.Caption.indexOf(query)来测试匹配。 模式 更多模式即将到来! -h 帮助 这将向您发送一个包含基本用法信息的DM。 -m 模因生成器(测试版) 此模式...

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    10 匹配非负整数(正整数 + 0) 11 匹配不包括零的非负整数(正整数 &gt; 0) 12 匹配正整数 13 匹配非正整数(负整数 + 0) 14 匹配负整数; 15. 匹配整数 ; 16 匹配非负浮点数(正浮点数 + 0) 17. 匹配正浮点数 18...

    每天一篇javascript学习小结(String对象)

    该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。 语法 stringObject.match(searchvalue) stringObject.match(regexp) searchvalue 必需。规定要检索的字符串值。 regexp ...

    一个web爬虫的事例.txt

    // 用正则表达式编译链接的匹配模式。 Pattern p = Pattern.compile("*=\\s*\"?(.*?)[\"|&gt;]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents); ArrayList&lt;String&gt; linkList = new ArrayList...

    JavaScript中数据结构与算法(四):串(BF)

    比如javascrript查找就是indexOf, 去空白就是trim,转化大小写toLowerCase/toUpperCase等等 这里主要讨论下字符串模式匹配的几种经典的算法:BF、BM、KMP BF(Brute Force)算法 Brute-Force算法的基本思想: 从目标串s...

    asp.net知识库

    忽略大小写Replace效率瓶颈IndexOf 随机排列算法 理解C#中的委托[翻译] 利用委托机制处理.NET中的异常 与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何判断ArrayList,...

    practice_to_delete

    суммадвухвмассиве4способа HappyLynx 10апреля2019в17时25分0ПотомучтоArray.indexOfработаетза为O(n),витогевесьвашалгори

    lua 程序设计学习.doc 版

    20.1 模式匹配函数 20.2 模式 20.3 捕获(Captures) 20.4 转换的技巧(Tricks of the Trade) 第21章 IO库 21.1 简单I/O模式 21.2 完全I/O 模式 21.2.1 I/O优化的一个小技巧 21.2.2 二进制文件 21.3 关于文件的其它...

    Managing Gigabytes: Compressing and Indexing Documents and Images

    In this fully updated second edition of the highly acclaimed Managing Gigabytes, authors Witten, Moffat, and Bell continue to provide unparalleled coverage of state-of-the-art techniques for ...

    JavaScript笔记

    如果不适用模式匹配方式,将执行原文匹配 结果:如果正则表达式写错,也将执行原文匹配 12.Array笔试题:js中数组声明方式: A new Array(7) B new Array(7,‘a’,true) C [7,'a',true]--js中所有[]都表示...

    javascript文档

    $1...$9 属性 返回在模式匹配中找到的最近的九条记录。 % 运算符 两个表达式的值相除,返回余数。 %= 运算符 用变量的值除以表达式的值,余数赋给变量。 & 运算符 对两个表达式执行按位“与”运算。 &= 运算符 ...

    JScript 语言参考

    $1...$9 属性 返回在模式匹配中找到的最近的九条记录。 % 运算符 两个表达式的值相除,返回余数。 %= 运算符 用变量的值除以表达式的值,余数赋给变量。 & 运算符 对两个表达式执行按位“与”运算。 &= 运算符 ...

    微软JavaScript手册

    $1...$9 属性 返回在模式匹配中找到的最近的九条记录。 % 运算符 两个表达式的值相除,返回余数。 %= 运算符 用变量的值除以表达式的值,余数赋给变量。 & 运算符 对两个表达式执行按位“与”运算。 &= 运算符 ...

    基于vue–key值的特殊用处详解

    v-for渲染的列表的结构采用“就地复用”的策略,也就说当数据重新排列数据时,会复用已在页面渲染好的元素,不会移动 DOM 元素来匹配数据项的顺序,这种模式是高效的,改变现有位置的结构的数据即可 eg: 问题:点击...

    MySQL高效模糊搜索之内置函数locate instr position find_in_set使用详解

    类似于java的indexOf(); 不过locate()只要找到返回的结果都大于0(即使是查询的内容就是最开始部分),没有查找到才返回0; 指定起始位置: SELECT LOCATE('bar','foobarbar',5);(从foobarbar的第五个位置开始查找) 2...

    Oracle 10g 开发与管理

    (1)help index 将显示SQL*Plus的所有命令 47 (2)help 命令名称 显示该命令的功能和选项 47 6.其他的SQL*Plus命令 47 (1)退出 SQL&gt; Exit | Quit; 47 (2)清除命令 47 (3)查看表结构信息 47 (4)执行操作...

Global site tag (gtag.js) - Google Analytics