**题目描述 **
一个字符串由字母G和H组成。我们称串中任意个连续的字符组成的子序列称为该串的子串。
如果一个字符串的子串中,字母G的个数为1,或者字母H的个数为1,则我们称这个子串中有一个落单的字母。
给定一个字符串,问长度在3以上(包括3)的子串,有多少个子串包含落单字母。
输入描述:
第一行是一个整数N,表示字符串的长度。
第二行是一个长度为N的字符串,由字母G和字母H组成。
输出描述:
输出这个字符串所有长度在3以上(包括3)的子串,有多少个子串包含落单字母
示例:
输入
4
GGHG
输出
3
说明
GGH、GHG、GGHG这三个子串包含落单字母。
备注:
对于40%的数据,N<=50
对于100%的数据,N<=5000
#include<stdio.h>
char s[5000];
int main(void){
int n,count=0;
scanf("%d",&n);
scanf("%s",s);
for (int i=2;i<=n-1;i++)
for (char *p=s;*(p+i)!='\0';p++){
char b[3]={0};
for (int j=0;j<i+1;j++){
if (*(p+j)=='G') b[1]++;
else b[2]++;
}
if (b[1]==1||b[2]==1) count++;
}
printf("%d",count);
return 0;
}
这是我写的代码,只能通过40%的用例,而且还超时了一点点,求指出问题所在,感谢!
没看出有什么错误的地方,但是超时的话是因为你的循环套了太多层,可以通过两层循环实现的,外层是子字符串的开始的地方, 内层是子字符串终止的地方,这样对于内层循环来说,字符串起始点相同,那b[1]b[2]的计数其实就可以保存使用,因为前面的计数都是相同的,当最后加一位字母的时候只需要继续自增一个就好了。
这样相当于时间复杂度减少了一个量级,有时间的话可以试一试。