一、先要掌握的概念:
字符串:是由零个或多个字符组成的有限序列
字串:串中任意个 连续的 字符组成的子序列
子串在主串中的位置表示:以子串的第一个字符在主串的位置来表示
模式匹配:也就是求子串在主串中的位置
模式串:子串
二、算法的大概思想:
围绕暴力和回溯的思想,也就是从主串的第一个字符开始一个个往下走+1
假设现有主串S (String) 和子串T (String),求字串T在主串S中的位置;建立两个指针i和j分别指向主串和子串的第一个字符,
然后利用i和j所指的字符开始逐个字符逐个字符的作比较,当S[i]==T[j]是,则当前的字符相同继续往下走,就是i++,j++;
当S[i]!=T[j]是,则匹配失败,我们需要回溯:就是i知道比较之前的位置的下一个,j则从首字符开始,就是i= i-j+1;j=0;
当j>=T.length是匹配成功
eg:S = "ABABC"
t = "BC"
第一次:i= 0,j = 0 ,S[i]!=T[j],回溯 i = i-j+1 = 1,j = 0;
第二次:i=1 ,j = 0,S[i] = T[j],i++,j++ ,i = 2,j = 1;S[i]!=T[j],回溯:i=i-j+1 = 2,j = 0;
第三次:i= 2,j = 0,S[i]!=T[j],回溯:i = i-j+1 = 3,j = 0;
第四次:i= 3,就= 0,S[i] = T[j],i++,j++,i = 4,j = 1,S[i]=T[j] ,j>=T.length(),所以匹配成功
三、代码.java
public class MoshiMatch {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
String S = in.next();
String T = in.next();
System.out.println(violentMatching(S, T));
public static int violentMatching(String s,String t) {
int sl = s.length();
int tl = t.length();
int i = 0;
int j = 0;
while(i<sl&&j<tl) {
if(s.charAt(i)==t.charAt(j)) {
i++;
j++;
}
else {
i = i-j+1;
j = 0;
}
}
if(j>=t.length()) return i-j;
else return -1;
}