C++ 如何使用STL算法找到分隔字符串中两个不同字母的最短星号序列?
我有这样一个字符串:C++ 如何使用STL算法找到分隔字符串中两个不同字母的最短星号序列?,c++,algorithm,stl,C++,Algorithm,Stl,我有这样一个字符串: A*A**B***A** 我对两个不同字母之间的星号序列感兴趣,特别是我需要找到最短的星号序列的长度。当然,对于上面的字符串,答案是2:A**B 我可以使用传统的循环很容易地解决这个问题,我已经习惯了这样的循环: const string s = "A*A**B***A**"; string::size_type last_letter=-1, min_seq_len=s.size(); for(int i = 0; i < s.size(); i++) {
A*A**B***A**
我对两个不同字母之间的星号序列感兴趣,特别是我需要找到最短的星号序列的长度。当然,对于上面的字符串,答案是2:A**B
我可以使用传统的循环很容易地解决这个问题,我已经习惯了这样的循环:
const string s = "A*A**B***A**";
string::size_type last_letter=-1, min_seq_len=s.size();
for(int i = 0; i < s.size(); i++) {
if(last_letter == -1 || s[i] == '*' || s[i] == s[last_letter]) {
if(s[i] != '*') {
last_letter = i;
}
} else {
min_seq_len = min(min_seq_len, i-last_letter-1);
last_letter = i;
}
}
常量字符串s=“A*A**B***A**”;
字符串::size_type last_letter=-1,min_seq_len=s.size();
对于(int i=0;istd::min_元素
std::find\u if
查找非星号auto letter_pairs = letter_pair_generator(s);
const auto min_seq_len = std::min_element(
std::begin(letter_pairs), std::end(letter_pairs),
[](const auto& x) { return x.asterisk_count(); });
string s = "A*A**B***A**";
for(const auto& p : letter_pair_generator(s)) cout << p;
其中,letter\u pair\u generator
是std::string
上的适配器,它公开了一个类似容器的接口,该接口返回两个不同的字母对,中间有星号。例如:
auto letter_pairs = letter_pair_generator(s);
const auto min_seq_len = std::min_element(
std::begin(letter_pairs), std::end(letter_pairs),
[](const auto& x) { return x.asterisk_count(); });
string s = "A*A**B***A**";
for(const auto& p : letter_pair_generator(s)) cout << p;
string s=“A*A**B***A**”;
对于(const auto&p:letter_pair_generator)cout我需要说的是,使用标准库并不能带来巨大的改进。但例如,如果没有明确的字母要求,那么示例将简单得多。无论如何,这是我的尝试
std::string::首先查找\u而不是\u的用法
int best = s.size();
int prev = -1;
int next;
while ((next = s.find_first_not_of("*", prev+1)) >= 0) {
if (prev >= 0 && s[prev] != s[next]) {
best = min(best, next - prev - 1);
}
prev = next;
}
可运行:
std::regex
用法:
regex r("(?=([^*][*]*[^*]))");
int best = s.size();
for (auto i = sregex_iterator(s.begin(), s.end(), r); i != sregex_iterator(); ++i) {
int pos = i->position(1);
int len = i->length(1);
if (s[pos] != s[pos + len -1]) {
best = min(len-2, best);
}
}
Runnable:您也可以使用字符串的首先查找\u而不是的\u
size\u t min(str.length()),prev(0),found(0);
而((find=str.find_first_not_of(“*”,prev))!=std::string::npos){
如果(str[found]!=str[prev]&&found-prev
Re,一堆“字母+星号+字母”组块:注意,因为一个字母可能是两个不同“组块”的一部分。