【发布时间】:2015-06-20 18:38:27
【问题描述】:
我正在尝试查找字符串中第一个和最后一个字符相同的子字符串的数量。
我可以通过两个 for 循环以天真的方式解决它。
我觉得可以解决得更有效率。
如何以更有效的方式解决它?
【问题讨论】:
我正在尝试查找字符串中第一个和最后一个字符相同的子字符串的数量。
我可以通过两个 for 循环以天真的方式解决它。
我觉得可以解决得更有效率。
如何以更有效的方式解决它?
【问题讨论】:
循环遍历字符串,并计算每个不同字符的出现次数。那么,如果一个字符只出现一次,则没有以它结尾和开始的子字符串,如果它出现两次——只有1次,如果3次——有3次,如果4次——6.函数是C( n,2) = n!/(2!(n-2)!) = n(n-1)/2.
这是一个潜在的实现。
inline int Nchoose2(int n) {
return n*(n-1)/2;
}
std::string s;
std::map<char,int> m;
int cnt = 0;
for (char c : s) {
if (!m.count(c)) m[c] = 0;
else ++m[c];
}
for (auto &c : m)
cnt += Nchoose2(c.second);
【讨论】: