字符串 题解

字符串 题解

字符串

题目

小熊有一个由小写英文字母组成的字符串s = s s s 1 s s s 2… s n sn sn。小熊想要计算 s s s中有多少子串包含字符串“ b e a r bear bear”,也就是找出满足字符串x(i, j)= s i si si s i si si+1… s j sj sj 包含至少一个字符串“ b e a r bear bear”的 ( i i i, j j j)对数(1≤ i i i j j j n n n)。
字符串 x x x( i i i, j j j)包含字符串“bear”定义为存在一个整数 k k k i i i k k k j j j-3),满足 s k sk sk= b b b s k sk sk+1= e e e s k sk sk+2= a a a s k sk sk+3= r r r
请帮助小熊解决这个问题。


输入

输入共1行,包含一个非空字符串 s s s。数据保证字符串 s s s中只包含小写英文字母。


输出

输出共1行,包含一个整数,表示这个问题的答案。


样例

input
bebearar

output
9


说明

【输入输出样例说明】
符合条件的9对( i i i, j j j)为:(1,6),(1,7),(1,8),(2,6),(2,7),(2,8),(3,6),(3,7),(3,8)。

【数据说明】
对于50%的数据,1≤ n n n≤200。
对于100%的数据,1≤ n n n≤3000。


解题思路

题意就是找出有多少个子串含有" b e a r bear bear"
如果能找到“ b e a r bear bear
累加当前字符串长度-“ b e a r bear bear”的最后一位
删去当前字符串的第一位
继续找,直到字符串为空


代码

#include
#include
#include
using namespace std;
string s;
int l,x,ans;
int main()
{
     
	cin>>s;
	while (s!="")
	{
     
	    l=s.size();
		x=s.find("bear");
		if (x!=-1)
		{
     
		   x+=3;  //拿bear的最后一位
		   ans+=l-x;  //以当前第一位为左边界,从bear的最后一位及以后都可以做右边界
	    }
		s.erase(0,1);  //删除第一位
	}
	printf("%d\n",ans);
	return 0;
} 

你可能感兴趣的:(字符串)