简单串模式匹配算法
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)); } }
。
相关推荐
- 可以接受正则表达式作为参数,使其能够进行更复杂的模式匹配。 #### 四、indexOf与search的区别 1. **参数类型:** - `indexOf()`方法只接受字符串作为参数。 - `search()`方法可以接受正则表达式或字符串作为...
本文将详细介绍JavaScript中一些常用字符串方法的用法,包括 substr、substring、indexOf、lastIndexOf、split 和 replace。通过这些方法,可以轻松地对字符串进行提取、分割和替换操作。 首先,让我们来看看 ...
2. **匹配规则**:`indexOf`简单地查找子字符串,不支持模式匹配;`search`则支持正则表达式的复杂匹配。 3. **大小写敏感性**:`indexOf`对大小写敏感,而`search`可以配合正则表达式的`i`标志实现大小写不敏感。 4...
正则表达式提供了更丰富的匹配规则,包括全局搜索、模式匹配等。 总结,`indexOf` 是 JavaScript 中一个非常实用的方法,用于查找子字符串或字符在原字符串中的位置。通过灵活运用,可以解决许多字符串处理问题。...
在计算机科学中,模式匹配是一项重要的字符串处理任务,用于在目标字符串中查找是否存在某个特定的子字符串。本文主要讨论的是Java中实现模式匹配的一种简单方法——蛮力匹配(Brute-Force Matching)。这种算法的...
- **模式匹配**:模式由元字符和量词组成,如`.`表示任意字符,`\w`代表单词字符,`\d`代表数字,`*`表示前面的元素零次或多次,`+`表示一次或多次,`?`表示零次或一次。 - **标志符**:如`g`全局匹配,`i`忽略大...
QByteArray适用于二进制数据,而QString更适合处理文本字符串,它们都提供了丰富的操作函数,如indexOf()用于查找子串,方便我们实现字符串匹配。 在程序设计上,可以创建一个基类StringMatcher,然后分别为每个...
C#提供了丰富的字符串方法,如`Substring`用于获取子字符串,`IndexOf`和`LastIndexOf`用于查找子串的位置,`Replace`用于替换子串,以及`Trim`和`ToLower`等用于去除空白字符和转换大小写。然而,需要注意的是,...
include方法检查字符串中是否包含某个模式,使用indexOf方法来实现。startsWith和endsWith方法分别用于判断字符串是否以特定模式开始或结束。empty方法用于判断字符串是否为空,而blank方法则检查字符串是否全为空白...
6. **awk**:强大的文本处理工具,可进行模式匹配、替换和数据分析。 7. **basename**:从文件路径中提取文件名,去除目录和扩展名。 8. **bash**:GNU Bourne-Again SHell,Linux的标准命令行解释器。 9. **bc**:...
7. 编程语言特性:熟悉各种编程语言中的字符串处理函数,如C++的std::string::find,Java的String.indexOf,Python的str.find等。 8. 动态规划:在某些特殊情况下,字符串匹配问题可以通过动态规划方法解决,例如...
2. 部分匹配:IndexOf将返回子字符串首次出现的完整匹配位置,而不是部分匹配位置。 3. 空字符串:如果搜索的值是空字符串(""),IndexOf将返回起始位置0。 4. 负索引:从后向前搜索时,如果fromindex为负值,实际...
综上所述,C#提供了一系列的字符串处理方法,包括基本的查找、长度计算和字符定位,以及通过正则表达式进行复杂的模式匹配。这些功能使得开发者能够高效地处理和分析字符串数据,同时通过UI反馈给用户,比如通过改变...
在实现这个最大正向匹配算法时,Java程序员可能会使用字符串类的方法,如indexOf()或contains(),或者自定义更高效的搜索结构,如Trie树(字典树)。Trie树是一种前缀树,特别适合于存储和查询字符串,可以快速地...
1. 只传递需要查找的元素,IndexOf就会从数组的起始位置开始查找,返回第一个匹配元素的索引。 2. 传递两个参数:第一个是要查找的元素,第二个是开始查找的位置(指定为数字索引),这样IndexOf就会从指定位置开始...
在Java编程中,比较两个字符串的匹配字数是一项常见的任务,尤其是在文本处理或模式匹配的场景下。以下是一个简单的实现,通过`RangeDifferencer4Bak`类来完成这个功能。这个类有两个主要方法:`getTempModel`和`...
在Java中,虽然没有内置的正则表达式库,但可以编写基于`String`类的方法链来实现类似功能,比如`indexOf()`、`contains()`等。 不过,以上所有方法的灵活性和通用性都无法与正则表达式相比。正则表达式通过组合...
4. **customPatternMatch(String input, char[] pattern)**:如果需要实现自定义的模式匹配,可以创建一个方法,使用栈(如`Stack.java`文件所示)来存储和检查字符序列。例如,检查输入字符串是否符合括号平衡: ``...
本文主要介绍C#中利用`IndexOf()`方法以及其他几种方法来查找匹配的数据。 #### `IndexOf()` 方法 `IndexOf()` 是一个非常常用的方法,用于确定指定子字符串是否存在于当前字符串中,并返回该子字符串首次出现的...