KMP算法——leetcode第28题
题目--28、实现strStr
这道题以前做题的时候卡住了,导致后面也没兴趣做下去其他的题目,看题解也没看懂,KMP算法。今天重新看了一遍高赞题解,有了新认识,遂记录下来,后面可以复习。
- 题目分析:实现一个indexof()函数功能
- 输入为两个,一个为待匹配的字符串target,一个为匹配模板pattern。
- 对不同target,寻找pattern在其中的位置。
- 这用到的主要知识是状态转移机,也是KMP算法的核心
- 要实现状态转移功能,代码主要通过以下来实现
int len=pattern.length();
int[][] dp=new int[len][256];
dp[0][pattern.charAt(0)]=1;
int x=0;//影子状态,用来构建dp数组
for(int i=1;i<len;i++){
for(int j=0;j<256;j++)//先根据影子状态将全部进行设初值
dp[i][j]=dp[x][j];
dp[i][pattern.charAt(i)]=i+1;//覆盖特殊的一个值
x=dp[x][pattern.charAt(i)];//更新影子状态
}
- 其中影子状态是精髓,因为这是确定性状态转移机,所以从前面状态到后面状态只有一种情况,其他255种情况都需要用影子状态来判断。
- 生成状态转移机后就很简单可以用了:
int state=0;
for(int i=0;i<target.length();i++){
state=dp[state][target.charAt(i)];
if(state==len)
return i-len+1;
}
return -1;
总结
能够将课本学到的知识实现在工程代码上有一种成就感,不过测试时间有点久,直接用java的indexof()函数最快,所以还需要研究下其源码。