我正在尝试查找字符串中具有相同的第一个和最后一个字符的子字符串数。
我可以通过两个for循环以天真的方式解决它。
我觉得它可以更有效地解决。
如何以更有效的方式解决问题?
答案 0 :(得分:4)
循环遍历字符串,并计算每个不同字符的出现次数。然后,如果一个角色只出现一次,就没有子串结束并以它开头,如果它出现两次 - 只有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);