查找包含最不同字符的字符串
Find string with the most different characters
>我有一个字符串数组,
斯帕努斯 , 萨普努斯 , 哈哈 , 中午 ...
如您所见,它们都以相同的字符开始和结束。
我该怎么做才能比较,让我们说"sparnus"和"sapnus",并找出哪个字符串有更多不同的字符?
Sparnus 有 s p a r n u s (6 个不同的字符)Sapnus 有 s a p n u s (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
与一个谓词一起使用,该谓词比较从字符串构建的两个集合的大小。
这是一个例子
#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::unique
和标准 C 函数std::strlen
该函数将为您提供每个字符串中唯一字符的数量。
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));
演示。
使用包含 256 个条目的布尔数组并对字符串进行循环,并将数组的每个标志设置为按字符串字母进行 true 索引。最后,您可以计算数组中的 true 数,并找到有多少个不同的字符。如果您使用整数数组代替布尔数组,您还可以计算找到字母的次数,如果它以某种方式起作用!(如果您不想使用集合作为先前的答案点,则可以这样做)。
#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;
}
相关文章:
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 尝试将字符串/字符转换为整数会产生意外结果
- 为什么没有访问所有字符串字符?
- 将子字符串字符从字符串值转换为 int,然后将其分配给 int 变量
- 如何将字符串字符与结构数组进行比较?
- 将单个字符串/字符输入串行监视器
- 读取字符串字符时出错 - 对于数组中的字符串值
- C++ C 样式字符串/字符数组的大小 - 优化
- 读取字符串字符时出错
- C++ 使用 Strtok 读取字符串字符时出错
- 如何将 int 数组的 1 个元素转换为字符串/字符
- 在另一个字符串中逐个复制字符串字符
- 将字符串字符映射到矢量
- MBED RTOS将Float转换为字符串/字符阵列
- 如何使用字符串字符数组中的 ++ 运算符访问下一个字符串
- 如何比较C++中的单个字符串字符?
- 内部字符串/字符如何在 int 和 float 中存储
- 将十六进制转换为可打印的字符串/字符
- wcscpy_s后读取字符串字符时出错
- 检查字符串字符和长度