Java 字符串匹配算法
2018-01-30 11:00
369 查看
Java 字符串匹配算法
在一个文本或者较长的一段字符串中,找出一个指定字符串,并返回其位置。指定一个父类AbstractMatch,使用matchAtPosition查看是否匹配。
public abstract class AbstractMatch { protected final String pattern; public AbstractMatch(String pattern) { this.pattern = pattern; } public abstract int match(String text); protected boolean matchAtPosition(String text, int position) { for (int i = 0; i < pattern.length(); i++) { if (pattern.charAt(i) != text.charAt(position + i)) { return false; } } return true; } }
1、简单算法
从初始位置开始,依次分别和pattern的各个文字的字符比较。
public class SimpleMatch extends AbstractMatch { public SimpleMatch(String pattern) { super(pattern); } public int match(String text) { for (int position = 0; position + pattern.length() <= text.length(); position++) { if (matchAtPosition(text, position)) { return position; } } return -1; } }
2、KMP算法
利用匹配失败后的信息,减少匹配次数。
例如模式ababc,文本ababdababc,匹配到position=4的时候,发生错误。
由于头部ab重复,匹配可以直接从position=2开始,还是匹配到position=4的时候,发生错误。
由于没有其他重复的地方,这次匹配从position=4开始
可以看到,在整个过程中,跳过了两次匹配,pattern里面重复的越多,节约的时间越多。
public class KMPMatch extends AbstractMatch { private int[] prefixArray; public KMPMatch(String pattern) { super(pattern); prefixArray = new int[pattern.length()]; int matches = 0; for (int i = 1; i < pattern.length(); i++) { if (pattern.charAt(i) == pattern.charAt(matches)) { matches++; prefixArray[i] = matches; } else { i++; matches = 0; } } } @Override public int match(String text) { int i = 0; int matches = 0; while (i < text.length()) { if (text.charAt(i) == pattern.charAt(matches)) { matches++; if (matches == pattern.length()) { return i + 1 - pattern.length(); } else { i++; } } else if (matches > 0) { matches = prefixArray[matches - 1]; } else { i++; } } return -1; } }
相关文章推荐
- 算法笔记_009:字符串匹配(Java)
- Java实现算法导论中Rabin-Karp字符串匹配算法
- 算法 字符串匹配之朴素算法和KMP算法及JAVA代码实现
- 显示回退的暴力字符串匹配算法.java
- 字符串匹配算法之___Sunday算法的java实现
- Java_字符串匹配算法总结
- 字符串匹配算法——Sunday算法和KMP算法(java版本)
- 求 JAVA 字符串匹配 完美算法
- Java实现 字符串匹配 KMP 算法
- 多模字符串匹配算法原理及Java实现代码
- 字符串匹配——朴素算法、KMP算法
- 算法习题33:字符串匹配(和谐文字)
- 【LeetCode-面试算法经典-Java实现】【012-Integer to Roman(数字转罗马字符)】
- 字符串匹配算法--KMP
- 字符串匹配算法strstr()
- 实用算法实践-第 22 篇 字符串匹配
- KMP字符串匹配算法笔记
- KMP字符串匹配算法笔记
- 字符串匹配算法之KMP
- 算法——字符串匹配之KMP——看不懂算我输