编写一个函数,接收一个字符串,统计其中任意两个及两个以上相邻字符相同的子串的个数。比如字符串"abbcccaddd"子串有"bb"、"cc"、"cc"、"dd"、"dd"、"ccc"和"ddd",共7个。函数原型为:int fun(const char *str);使用C语言完成
时间: 2023-07-02 16:23:32 浏览: 65
C语言编程-编写一个函数,该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数;
5星 · 资源好评率100%
好的,这是一个比较典型的字符串处理问题,可以使用双指针来解决。下面是实现的代码:
```c
int fun(const char *str) {
int count = 0;
int len = strlen(str);
int i = 0, j = 1;
while (j < len) {
if (str[j] == str[i]) {
j++;
} else {
int n = j - i;
if (n > 1) {
count += n * (n - 1) / 2;
}
i = j;
j = i + 1;
}
}
int n = j - i;
if (n > 1) {
count += n * (n - 1) / 2;
}
return count;
}
```
首先定义一个计数器 `count` 初始化为 0,字符串长度 `len` 等于 `strlen(str)`。
接下来使用双指针 `i` 和 `j` 分别指向相邻的两个字符。如果 `str[j]` 和 `str[i]` 相等,那么就将 `j` 向后移动一位,继续比较下一对相邻字符。如果不相等,说明 `str[i..j-1]` 这个子串中任意两个及两个以上相邻字符相同,计算这个子串中相邻字符相同的子串个数,然后将 `i` 和 `j` 分别指向下一对相邻字符,继续比较。直到 `j` 到达字符串的末尾为止。
最后还要特别处理一下字符串的末尾,因为最后一段相邻的字符没有比较过。如果最后一段子串的长度大于 1,则计算相邻字符相同的子串个数,将计数器累加即可。
这个算法的时间复杂度是 $O(n)$,其中 $n$ 是字符串的长度。
阅读全文