题目要求:判断str1是否含有str2,存在就返回第一次出现位置,否则返回-1
首先使用暴力匹配算法
public class BaoLi {
public static int baoli(String str1,String str2)
{
char[] s1=str1.toCharArray();
char[] s2=str2.toCharArray();
int len1=s1.length;
int len2=s2.length;
int i = 0,j=0;
while(i<len1&&j<len2)
{
if(s1[i]==s2[j])
{
i++;
j++;
}else
{
i=i-j+1;
j=0;
}
}
if(j==len2)
{
return i-j;
}else
{
return -1;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String str1="abaacababcac";
String str2="ababc";
int result=baoli(str1, str2);
System.out.println(result);
}
}
接下来kmp算法
public class Kmp {
public static int[] kmpnext(String content)
{
int[] next=new int[content.length()];
next[0]=0;
for(int i=1,j=0;i<content.length();i++)
{
while(j>0&&content.charAt(i)!=content.charAt(j))
{
j=next[j-1];
}
if(content.charAt(i)==content.charAt(j))
{
j++;
}
next[i]=j;
}
return next;
}
public static int kmpsearch(String str1,String str2,int []next)
{
for(int i=0,j=0;i<str1.length();i++)
{
while(j>0&&str1.charAt(i)!=str2.charAt(j))
{
j=next[j-1];
}
if(str1.charAt(i)==str2.charAt(j))
{
j++;
}
if(j==str2.length())
{
return i-j+1;
}
}
return -1;
}
public static void main(String[] args) {
String str1="abaacababcac";
String str2="ababc";
int[] next=kmpnext("ababc");
int result=kmpsearch(str1, str2, next);
System.out.println(Arrays.toString(next));
System.out.println(result);
}
}
思路: