首先上封装好的方法
/**
* 查找某个字符或字符段在字符串中出现的次数
*
* @param str 待被查找的字符串
* @param need 待查找的字符
* @return 出现的次数
*/
public static int totalNum(String str, String need) {
if (str == null || need == null) {
return 0;
}
char strArr[] = str.toCharArray();
int needLen = need.length();
int strLen = str.length();
//如果待查找的字符串长度小于需要查找的字符串长度,则一定不存在
if (needLen > strLen) {
return 0;
}
int count = 0;
boolean flag = true;
for (int i = 0; i < strArr.length; i++) {
StringBuilder builder = new StringBuilder();
for (int j = 0; j < needLen; j++) {
//判断当前在char数组中的位置加上需要查找的字符串的长度是否大于char数组的长度,如果是则跳出循环,方式数组越界
if ((i + j) >= strLen) {
flag=false;
break;
}
builder.append(strArr[i + j]);
}
if (!flag) {
break;
}
if (builder.toString().equals(need)) {
count++;
}
}
return count;
}
思路
这个应该还是挺常用的一个方法,抽时间写了一下,直接拷过去就能使用。
当时写这个算法的时候还发现另一种算法,使用替换字符串的方法
警告:该算法有误,请勿使用
public static int totalNum1(String str, String need) {
if (str == null || need == null) {
return 0;
}
// 得到原始待查找的字符串
int strLen = str.length();
// 得到需要查找的字符串长度
int needLen = need.length();
// 将需要查找的字符串替换为空
String newStr = str.replace(need, "");
// 得到被替换后的字符串
int newStrLen = newStr.length();
// 新的字符串长度减去原先的字符串长度再除以需要查找的字符串长度则为这个字符在字符串中出现的次数
return (strLen-newStrLen)/needLen;
}
这种方法乍一看好像没有什么问题,但是如果有下面这种情况呢。
String str="aaaaaaaa";
String need="aa";
这样如果用替换字符串的方法的话则会返回有4,因为aa一旦被替换掉是直接就去掉2个a,但是正确答案应该是返回7个才对,我们先看一下我最上面那个算法思路:
为每个a编号,则有
a a a a a a a a
1 2 3 4 5 6 7 8
那么组合方式有(1、2)、(2、3)、(3、4)、(4、5)、(5、6)、(6、7)、(7、8)
如果我们用程序实现的话,则将待被查找的字符串转成char数组
char strArr[] = str.toCharArray();
每次数组向后移一位,然后再通过需要查找的字符串的长度的拼接新的字符串,通过equals比对是否相等,如果相等则加1
for (int i = 0; i < strArr.length; i++) {
StringBuilder builder = new StringBuilder();
for (int j = 0; j < needLen; j++) {
if ((i + j) >= strLen) {
break;
}
builder.append(strArr[i + j]);
}
if (!flag) {
break;
}
if (builder.toString().equals(need)) {
count++;
}
}
加入我的行列:
(嘿嘿嘿,点击这里关于我哦,分享小知识):https://www.jianshu.com/p/7d19f0df5b6b