Leetcode28. 实现 strStr()
注意:×
- 学习的是Labuladong的KMP方式理解,用了有限自动机link
- 需要多次回看,应该是现在动态规划理解不深导致的绕
public class Solution {
@Test
public void test1(){
KMP aaab = new KMP("AAAB");
System.out.println(aaab.search("AAAAAAB"));
}
class KMP {
private int[][] dp;
private String pat;
public KMP(String pat) {
this.pat = pat;
/*
* 使用pat构建dp数组
* 1.使用pat的长度初始化dp,将1状态给进数组,设置影子状态X
* 2.创建状态转移图
* */
// 1.使用pat的长度初始化dp,将1状态给进数组,设置影子状态X
int M = pat.length();
dp = new int[M][256];
dp[0][pat.charAt(0)] = 1;
int X = 0;
// 2.创建状态转移图
for (int j = 1; j < M; j++) {
for (int c = 0; c < 256; c++) {
if (c == pat.charAt(j)){
dp[j][c] = j + 1;
}else {
dp[j][c] = dp[X][c];
}
}
// 更新X
X = dp[X][pat.charAt(j)];
}
}
public int search(String txt) {
int M = pat.length();
int N = txt.length();
// 状态记录 j
int j = 0;
for (int i = 0; i < N; i++) {
j = dp[j][txt.charAt(i)];
if (j == M) {
return i - M + 1;
}
}
return -1;
}
}
}
459. 重复的子字符串
注意:×
- 没写了,发现这一题如果是按照上文中所说的动态规划的方式来理解KMP是不好做的,脑袋不清醒,下次再看