首尾字符相同的子字符串的数目

来源:互联网 发布:embedpano.js 编辑:程序博客网 时间:2024/05/17 09:20

直接上栗子:

假如输入字符是:

"abcab"

那么输出结果为:

7

解释:该字符串所有的子字符串列出来,你会发现,首尾字符相同的子字符串有:

"a""abca""b""bcab""c""a""b"

一共七个,所以输出7。

再举个栗子:

输入字符串:

cab

输出:

3

解释,首尾字符相同的子字符串有:

"c""a""b"

栗子已经很很清楚了,其实题目也比较简单,那么首先想到的肯定是把所有的子字符串全部搞出来,然后判断一下首尾字符是否相同,就可以了。

这个想法当然可行,但是时间复杂度较高,属于O(n2)级别的,所以还得想办法。

从第二个栗子我们已经可以看出,其实输出结果还是跟字符串本身的长度是有关系的,这是因为把字符串中任意一个字符单独拿出来就是符合题意的子字符串,当然,结果一般比字符串长度要大。

那么我们可以这么想了,假如一个字符串中有一种字符它出现了n次:

"....a......a......a.......a......."

那么以相同的字符所在位置截取的字符串肯定是符合题意的,那么这样的字符串又有多少种呢,答案很显然:C2n种,也就是n个中任意挑选两个,发现这个规律以后,那么代码就很好写了,当然要计算组合个数,首先要对字符进行统计:

#include <bits/stdc++.h>using namespace std;const int MAX_CHAR = 26;int countSubstringWithEqualEnds(string s){    int result = 0;    int n = s.length();    int count[MAX_CHAR] = {0};    for (int i=0; i<n; i++)        count[s[i]-'a']++;    for (int i=0; i<MAX_CHAR; i++)        result += (count[i]*(count[i]+1)/2);    return result;}int main(){    string s("abcab");    cout << countSubstringWithEqualEnds(s);    return 0;}

这个时间复杂度就是O(n)级别的了。

0 0