[英]Find string with the most different characters
我有一个字符串数组
sparnus,sapnus,哈哈,中午...
如您所见,它们都以相同的字符开头和结尾。
我可以做些什么比较,比如说“ sparnus”和“ sapnus”,找出哪个字符串具有更多不同的字符?
sparnus有sparnus(6个不同字符)sapnus有sapnus(5个不同字符)
(注意:s会重复,所以它不是一个不同的字符)
有功能吗? 算法? 欢迎提供提示和建议。
标准容器std::set
本身实际上是一种算法。:)
例如
#include <iostream>
#include <string>
#include <set>
int main()
{
std::string s1( "sparnus" ), s2( "sapnus" );
std::cout << std::set<char>( s1.begin(), s1.end() ).size() << std::endl;
std::cout << std::set<char>( s2.begin(), s2.end() ).size() << std::endl;
return 0;
}
输出是
6
5
因此,您可以将标准算法std::max_element
与带有谓词的谓词std::max_element
使用,该谓词比较从字符串构建的两个集合的大小。
这是一个例子
#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <cstring>
#include <iterator>
int main()
{
const size_t N = 10;
char s[][N] = { "lol" , "noon", "sparnus", "sapnus" };
auto it = std::max_element( std::begin( s ), std::end( s ),
[]( const char *a, const char *b )
{
return std::set<char>( a, a + std::strlen( a ) ).size() <
std::set<char>( b, b + std::strlen( b ) ).size();
} );
std::cout << *it<< std::endl;
return 0;
}
输出是
sparnus
或者,您可以使用此处一篇文章中显示的方法,该方法由于未知原因而被删除。 例如,您可以使用标准算法std::sort
对所有单词进行std::sort
然后应用标准算法std::unique
和标准C函数std::strlen
将为您提供每个字符串中唯一字符的数量。
使用256个条目的布尔数组,并在字符串上循环,然后根据字符串的字母将数组的每个标志设置为true索引。 最后,您可以计算数组中的true数,并找到其中有多少个不同的字符。 如果使用int数组而不是布尔数组,还可以计算找到某个字母的次数(如果可以)! (如果您不想将集合用作先前的答案,可以这样做)。
#include <iostream>
#include <string>
int cnt(std::string s){
bool b[0x100]={false};int r=0;
for(int i:s) b[i]=true;for(int i:b) r+=i;
return r;
}
int main(int argc, char **argv)
{ std::cout<<cnt("sparnus")<<" "<<cnt("sapnus")<<std::endl;
return 0;
}
template <typename InputIterator>
std::size_t countDiffChars( InputIterator first,
InputIterator last )
{
bool lookup[1 << CHAR_BIT] {};
std::size_t count = 0;
while (first != last)
{
auto&& val = lookup[(unsigned char)*first++];
count += !val;
val = true;
}
return count;
}
用法:
char const str[] = "Hello";
auto c = countDiffChars(std::begin(s), std::end(s));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.