查找一个字符串中相同字符串的个数

有四种思路,消耗内存和时间递增:
1.遍历(弃用,使用 substring ,每次截取当前字符串的后面字符串,然后使用 Contains 查看后面字符串还有没有匹配项,如果还有,那么截取后面的字符串),这一步很花时间,因为每次都要截取字符串,等于需要遍历,如果数量 >10W 的时候,毋庸置疑会比较卡顿,但是处理小文件也可以,只是大文件十分不推荐。
2. IndexOf(),如果 整个字符串.IndexOf (String value , int startIndex)!= -1,那么有匹配项,再次startIndex+1后再次查找即可。这一步省去了每一次都要截取一定长度的字符串的时间。
3. Count(),但是要注意Count()方法需要的是 IEnumerable< char > 类型的参数,可以使用 lambda表达式,但是这个方法有局限性,只能查找单个字符,如果你想查找的是一个字符串,这个方法不管用。
4.将当前需要查找的这个字符串在整个字符串中全部替换成空字符,然后用删除之前的字符串的长度减去现在剩余字符串的长度,差额 / 单位长度,用到的函数是Replace(),消耗内存量和时间都最短,字符串和字符都能够通用。

在此只例举后面三种方法,遍历方法弃用

1. IndexOf()

//相同字符串的个数
int countNum;
//相同字符串的位置List
List<int> breakIndex;

private void CalculateNum(string father, string son)
{
	countNum = 0;
	breakIndex = new List<string>();
	int index = father.IndexOf(son);
	while(index!=-1)
	{
		countNum++;
		breakIndex.Add(index);
		//这里 Index+1 是为了检索下一个的时候,位置需要向后挪1个字符,而不是挪 son.length 长度
		index += index;
		index = father.IndexOf(son,index);
	}
}
//打印个数
Console.WriteLine(countNum);

2. Count()--------- 查找单个字符

//整个字符串
string father;
//需要查找的字符串
string son;
private void CountNum()
{
	//这里查找的单个字符是换行符,Count 方法中用 lambda 表达式
	int number = father.Count(i => i == '\n');
	//打印个数
	Console.WriteLine(number);
}

3. 通用最高效方法

//整个字符串
string father;
//需要查找的字符串
string son;
private int CountNumber()
{
	     //判断是否有相同字符串
         if (father.Contains(son))
         {
          	//用一个字符串储存被替换后的整个字符串
          	string strReplaced = father.Replace(son, "");
        	//两个字符串的长度差值 / 被替换掉的字符串单位长度
          	return (father.Length - strReplaced.Length) / son.Length;
          }
          //没有返回0个
          return 0;
}
void Main()
{
		//存储相同的个数
		int countNum = CountNumber();
		//打印个数
		Console.WriteLine(countNum);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值