package str;
import java.util.Scanner;
public class StrBF {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String s1 = s.next();
String s2 = s.next();
System.out.println(bf(s1,s2));
}
private static int bf(String s1, String s2) {
// TODO Auto-generated method stub
//初始化下标
int i=0,j=0;
char[] s = s1.toCharArray();
char[] s0 = s2.toCharArray();
//循环判断
while(i<=s.length-1 && j<=s0.length-1) {
//如果匹配的字符串找到了第一个相等项
if(s[i] == s0[j]) {
//两个字符串下标同时向后移
i++;j++;
}
else {
//否则回溯 匹配字符串从头开始匹配主字符串的下一位
i=i-j+1;j=0;
}
}
//如果所匹配的字符串下标正好和长度相等及找到了
if(j == s0.length)
return i-j;
else
return -1;
}
}
package str;
public class StrKMP {
//伪代码
//第一步获取子串的前缀表
//比较 不相等 通过前缀表回退 找到前后缀最长相等部分
// 相等 j++ i++
//比较完成之后匹配成功返回 i-j 字符串的初始位置 否则-1
//1.获取前缀表
//1初始化 i 后缀最后一位 j 前缀最后一位 数组next[0]=0
//2.1 比较前后缀是否相等 不相等 前缀后退 注意这里是循环后退而不是一步以后退
//2.2 如果相等 则前进
//3.为数组赋值 前缀表找的是原生的 没有后退 或者加一 所以数组赋值就是当前索引的前一位,然后比较时也是从前一位的索引开始后退
public static void main(String[] args) {
String s = "dsdsdsdfffe";
String p = "ffe";
System.out.println(kmp(s,p));
}
private static int kmp(String s, String p) {
// TODO Auto-generated method stub
int[] next = new int[p.length()];
getnext(p,next);
int i=0,j=0;
for(;i<s.length();i++){
while(j>0 && s.charAt(i)!=p.charAt(j)) {
//不相等时回退到 前一位
j=next[j-1];
}
if(s.charAt(i)==p.charAt(j)) {
j++;
}
if(j == p.length())
return i-j;
}
return -1;
}
//获取前缀表
private static void getnext(String p, int[] next) {
// TODO Auto-generated method stub
//初始化 i 后缀最后一个字母 j 前缀最后一位 前缀表第一位为0
int i ,j=0;
next[0] = 0;
for(i = 1;i<p.length();i++) {
//不相等的时候
while(j>0 && p.charAt(i)!=p.charAt(j)) {
//回退
j = next[j-1];
}
//相等时 后移
if(p.charAt(i)==p.charAt(j)) {
j++;
}
//数组
next[i]=j;
}
}
}