例如:
s1=“ababa”
s2=“aba”
s1中包含s2中子串的个数为2。
第一种做法:
就是直接循环遍历s1,每次在s1中裁剪s2长度的字符与s2比较,这种方式缺点是每次计数加1,效率太低。
调用String 的indexOf可以统计出s2的初始位置,并且可以指定开始位置,可是开始位置如果每次加s2串的长度,如上,那么结果就是1,显然不对。调用这个方法就不能每次+1了,关键是下次的初始位置是什么?
第二种方式:
看s2字符串的规律,aba,abcab,前一部分与后一部分已经相等了,那么只要上次abcab匹配了,计数量,只要加上重复的个数就行了。
import java.util.Scanner;
import java.util.Stack;
import java.util.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cn = new Scanner(System.in);
String s = "aabaabaab";
String s2 = "aabaa";
int len = test(s2);
int index = 0,count=0;
//每次调用完indexOf方法后,下次起始位置就是上次的起始位置+子串的重复长度
while(s.indexOf(s2,index)!=-1) {
index +=len;
count++;
}
System.out.println(count);
}
//统计子串前缀与后缀重复的部分,返回最大重复长度+1,表示下次再主串中的起始位置
public static int test(String str) {
int i = 1;
int j = str.length() -i;
int len = 0;
while(i<=j) {
String s1 = str.substring(0,i);
String s2 = str.substring(j,str.length());
if(s1.equals(s2)) {
len = Math.max(len, i);
}
i++;
j=str.length()-i;
}
if(len ==0) return str.length();
else return str.length()-len;
}
}