c++ - 如何有效地找到具有相同第一个和最后一个字符的字符串中的子字符串数?

标签 c++ string substring

我正在尝试查找具有相同第一个和最后一个字符的字符串中的子字符串数。

我可以通过两个 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);

关于c++ - 如何有效地找到具有相同第一个和最后一个字符的字符串中的子字符串数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30957566/

相关文章:

c++ - 无序映射 : clear() does not release heap on clear()

c++ - 如何从方程中提取变量?

c - 如何仅使用 C 预处理器计算字符串文字的哈希值?

Python:在关键字前后抓取文本

C++我如何为ifstream使用变量

C++ 无法修改类的实例

javascript - 你能用 Jquery 操作字符串中的数字吗?

python - 替换 python 中的精确子字符串

mysql - 需要查询逻辑方面的帮助

ios - 使用 NSRange 获取子字符串