Leecode统计子串个数(java)
/**
- 获取一个字符串在另一个字符串中出现的次数。判断str2在str1中出现的次数
*/
public class StringExer2 {
public static void main(String[] args) {
String str1 = "ab";
String str2 = "abaaba";
getCount(str1, str2);
System.out.println("子串出现的次数为:" + count);
}
/*
* 如果发现str2中有字符与str1中字符相等,则进入内层循环
* 用str2中每一个字符去和str1的字符比较
* 如果不相等,结束内层循环
* 如果相等,判断当前子串索引是否与子串长度-1相等
* 如相等,则子串已遍历完,count+=1
* 如不等,则继续下一次内层循环
*
*
*/
static int getCount(String str1, String str2) {
str1 = "ab";
str2 = "aabjkdaaaaafjksdabkjdfsdabj";
//将字符串转换成字符数组
char[] ch1 = str1.toCharArray();
char[] ch2 = str2.toCharArray();
int len1 = str1.length();
int len2 = str2.length();
int count = 0;//记录出现次数
boolean loopFlag = true;//设置一个标识,用于判断是否找到匹配字符的开关
for (int i = 0; i < len2; i++) {
//用比较数组的首元素进行匹配,一旦匹配到相同的字符,开始后继的检测
if (ch1[0] == ch2[i]) {
for (int j = 0, k = i; j < len1; j++, k++) {
if (k != len2 && ch1[j] == ch2[k]) { // k != len2 是为了应对ab在aba中出现的这种状况
//比较完最后一个字符元素且相同,计数器+1
if (j == len1 - 1) {
count++;
i += len1 - 1;//用于跳过已在匹配的子字符串范围内的长度,-1是为了抵消循环的递增
loopFlag = false;
}
} else
break;//一旦发现对应位数不相等,退出检测
}
}
}
if (loopFlag) {
System.out.println("没有匹配的字符串!");
}
return count;
}
}