查找具有最多不同字符的字符串

时间:2014-11-23 16:18:06

标签: c++ string algorithm compare character

我有一个字符串数组,

sparnus,sapnus,lol,noon ......

正如你所看到的,他们都以相同的角色开始和结束。

我可以做些什么来比较,让我们说“sparnus”和“sapnus”并找出哪个字符串有更多不同的字符?

sparnus s s a r n u s(6个不同的字符) sapnus有一个(5个不同的字符)

(注意:s重复自己,所以它不是一个不同的角色)

有功能吗?算法?欢迎提示和建议。

3 个答案:

答案 0 :(得分:1)

标准容器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将为您提供每个字符串中唯一字符的数量。

答案 1 :(得分:0)

使用256个条目的布尔数组并在字符串上循环,并将数组的每个标志设置为字符串字母的真正索引。最后,您可以计算数组中的trues数量,并找出有多少不同的字符。 如果你使用一个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;
}

答案 2 :(得分: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));

Demo