您的位置:首页 > 编程语言 > Java开发

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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: