文字列の長さmのセット
。図1に示すように、文字列の最初の部分文字列がメインストリングと比較される
2、同一であれば、現在比較M-1以下のメインの文字列と文字の次のサブストリングを文字が順番に比較し、異なる比較結果になるまで、またはサブストリング比較のすべての文字を終了
現在のメイン列:2、比較におけるサブストリングのすべての文字が、次に一致が成功したことを、メインストリングの位置でストリングである場合にポインタ- 1 M +
2-B、文字が一致比較中に発生していない場合、サブストリング文字比較の最初の文字とメイン列の次の位置にメインストリングポインタバックだけでなく、ポインタストリング最初の文字列にバック(1)
3、そうでなければ、ポインタメインストリングの下方への移動、最初にサブストリングポインタバック
package string;
import java.util.Scanner;
public class Index {
/*
* 字符串模式匹配,回溯法
* */
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String sup = sc.nextLine(); //主串
String sub = sc.nextLine(); //子串
/*
* 设字串长度为m
* 1、用子串的第一个字符依次与主串的字符作比较
* 2、如果相同,则用子串的下面的字符与主串中当前比较字符接下来的m-1个字符依次比较,直到比较结果不同或者子串后的所有字符比较完毕
* 2-a、如果子串中的所有字符比较完毕,那么说明匹配成功,子串在主串中的位置就是:当前主串的指针 - m + 1
* 2-b、如果比较过程中出现字符不匹配,则使主串的指针回溯到主串中与子串第一个字符比较的字符的下一个位置,同时子串指针也回溯到串首(1)
* 3、否则,主串指针向下移动一位,子串指针回到串首
* */
int i = 0; //主串指针
int j = 0; //子串指针
while( i < sup.length() && j < sub.length()) {
if (sup.charAt(i) == sub.charAt(j)) {
i ++;
j ++;
} else {
i = ((i - j + 1) + 1) -1;
j = 0;
}
}
if (j >= sub.length()) {
System.out.println(sub + "在" + sup + "的第" + (i - j + 1) + "个字符处");
} else {
System.out.println(sup + "中没有" + sub);
}
}
}