面试碰到一个字符串匹配的题,当时没写出来,过后再来补写??
如题:
第一时间想到kmp:
图片来自:https://blog.csdn.net/qq_37969433/article/details/82947411
代码:
package com.itdr.demo;
/**
* Class: KMPDemo
* version: JDK 1.8
* create: 2019-10-23 13:45:07
*
* @author: heynn
*/
public class KMPDemo {
public static void main(String[] args) {
String mainStr = "ABCD AB SIODS SABCDABAOAM AISJIM ABCDABCDABDECAIJI";
String patternStr = "ABCDABD";
kmp(mainStr, patternStr);
}
public static int kmp(String mainStr, String patternStr){
String[] m = mainStr.split("");
String[] p = patternStr.split("");
// i:主串下标,j:模式串下标
int i, j;
// sign:跟踪模式串首字符与主串匹配的下标
int sign = -1;
for (i = 0, j = 0; i < m.length && j < p.length; ) {
if (m[i].equals(p[0])){
sign = i;
}
if (m[i].equals(p[j])){
i++;
j++;
}else {
j = 0;
if(sign != -1){
i = sign + 1;
j++;
sign = -1;
}else {
i++;
}
}
}
if ( j == p.length){
System.out.println("匹配成功,主串下标区间:[" + (i-j) + ", " + (i-1) + "]");
return (i-j);
}
System.out.println("匹配失败");
return -1;
}
}