leetcode28.实现strStr()(暴力拆解,双指针,KMP算法)


	leetcode28.实现strStr()(暴力拆解,双指针,KMP算法)
[编程语言教程]

package newleetcode;

/**
* leetcode20.strStr匹配字符串
* 给定一个主串和一个匹配字符串
* 在主串中寻找匹配字符串并返回下标
*/
public class LeetCode28 {
//KMP算法
//dp前一个括号代表匹配状态
private int[][] dp;
//匹配字符串
private String pat;
//kmp算法构造
public LeetCode28(String pat){
this.pat=pat;
int length=pat.length();
//初始化
dp=new int[length][256];
//状态为0时匹配成功返回1
dp[0][pat.charAt(0)]=1;
//影子状态[匹配失败时判断具体回溯][前缀,后缀]
int shadow=0;
//造字典(通过for循环构造一个匹配字符串字典,目的是通过判断匹配不同字符时字符串如何回溯)
for(int j=1;j<length;j++){
for(int c=0;c<256;c++){
if(pat.charAt(j)==c){
//匹配成功时状态进1
dp[j][c]=j+1;
}else {
//判断当前状态在匹配失败情况下根据c不同返回不同状态
dp[j][c]=dp[shadow][c];
}
}
//判断前缀后缀,并更新影子状态(不同状态下匹配不同字符会返回相应状态)
shadow=dp[shadow][pat.charAt(j)];
}
}

//kmp算法搜索
public int search(String txt){
//初始化匹配字符串状态
int j=0;
//for循环,待匹配字符串(主串)永不回溯
for(int i=0;i<txt.length();i++){
//计算匹配状态
j=dp[j][txt.charAt(i)];
//匹配成功时返回相应位置
if(j==pat.length())return i-pat.length()+1;
}
return -1;
}

//普通搜索方法
public int search1(String pat,String txt){
//判断匹配字符串是否为空
if(pat.length()==0)return 0;
//判断匹配字符串是否大于主串
if(txt.length()<pat.length())return -1;
for (int start=0;start<txt.length()-pat.length()+1;start++){
//substring截取字符串进行值匹配,匹配成功返回相应值
if (txt.substring(start,start+pat.length()).equals(pat))
return start;
}
return -1;
}

//双指针搜索方法
public int search2(String pat,String txt){
//判断匹配字符串是否为空
if(pat.length()==0)return 0;
//判断匹配字符串是否大于主串
if(txt.length()<pat.length())return -1;
int pn=0;
while (pn<txt.length()-pat.length()+1){
//如果第一个字符不匹配则直接向后匹配,节省匹配时间
while (pn<txt.length()-pat.length()+1&&txt.charAt(pn)!=pat.charAt(0))pn++;
//curlen匹配成功长度,pl子串指针
int curlen=0,pl=0;
//匹配成功即进位继续匹配
while (pl<pat.length()&&pn<txt.length()&&txt.charAt(pn)==pat.charAt(pl)){
pn++;
pl++;
curlen++;
}
if(curlen==pat.length())return pn-pat.length();
//子串回溯
pn=pn-curlen+1;
}
return -1;
}

public static void main(String args[]){
String x="ba";
String txt="aaabaa";
LeetCode28 leetCode28=new LeetCode28(x);
System.out.println(leetCode28.search2(x,txt));
}
}
/**
* leetcode提交代码
* class Solution {
* public int strStr(String haystack, String needle) {
* if(needle.length()==0)return 0;
* if(haystack.length()<needle.length())return -1;
* for (int start=0;start<haystack.length()-needle.length()+1;start++){
* //substring截取字符串进行值匹配,匹配成功返回相应值
* if (haystack.substring(start,start+needle.length()).equals(needle))
* return start;
* }
* return -1;
* }
* }
*/

leetcode28.实现strStr()(暴力拆解,双指针,KMP算法)

原文地址:https://www.cnblogs.com/shudaixiongbokeyuan/p/13412941.html

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » leetcode28.实现strStr()(暴力拆解,双指针,KMP算法)