[英]Remove repeating characters from string
我有一个字符串,例如acaddef
或bbaaddgg
。 我必须尽快删除所有重复的字符。 因此,例如, pooaatat
之后应该看起来像poat
和ggaatpop
应该看起来像gatpo
。 是否有任何内置函数或算法可以快速完成? 我试图搜索STL,但没有满意的结果。
好的,所以这里有4种不同的解决方案。
std::string str = "pooaatat";
// Prints "poat"
short count[256] = {0};
std::copy_if(str.begin(), str.end(), std::ostream_iterator<char>(std::cout),
[&](unsigned char c) { return count[c]++ == 0; });
std::string str = "pooaatat";
// Prints "poat"
std::string::iterator iter = str.begin();
std::copy_if(str.begin(), str.end(), std::ostream_iterator<char>(std::cout),
[&](char c) { return !std::count(str.begin(), iter++, c); });
std::string str = "pooaatat";
// Prints "poat"
std::unordered_set<char> container;
std::copy_if(str.begin(), str.end(), std::ostream_iterator<char>(std::cout),
[&](char c) { return container.insert(c).second; });
std::string str = "pooaatat";
// Prints "poat"
std::unordered_map<char, int> container;
std::copy_if(str.begin(), str.end(), std::ostream_iterator<char>(std::cout),
[&](char c) { return container[c]++ == 0; });
AFAIK,没有内置的算法来做到这一点。 如果要仅删除连续的重复字符,则std::unique
算法有效。
但是,您可以遵循以下简单方法:
如果字符串仅包含ASCII字符,则可以形成一个布尔数组A [256],表示是否已经遇到相应的字符。
然后,如果A [character]仍为0(并使A [character] = 1),则只需遍历输入字符串并将字符复制到输出。
如果字符串包含任意字符,那么您可以使用std::unordered_map
或char的std::map
到int。
内置的正则表达式应该是高效的,即
#include <regex>
[...]
const std::regex pattern("([\\w ])(?!\\1)");
string s = "ssha3akjssss42jj 234444 203488842882387 heeelloooo";
std::string result;
for (std::sregex_iterator i(s.begin(), s.end(), pattern), end; i != end; ++i)
result.append((*i)[1]);
std::cout << result << std::endl;
当然,您可以根据需要修改cpaturing组。 好消息是它已经在Visual Studio 2010 tr1中得到支持。 但是,gcc 4.8似乎与正则表达式迭代器有问题 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.