【问题标题】:Sorting a string lexicographically in c++在 C++ 中按字典顺序对字符串进行排序
【发布时间】:2020-08-15 16:02:14
【问题描述】:

我是编程新手。我刚刚学习了 C++ 中的字符串。

我有 N 个字符串,我想按字典顺序对它们进行排序。(字典顺序)

如何,我可以这样做,因为 N 很大 1 <= N <= 1e5 并且每个字符串的大小是 1 <= |s| <= 1000

而且该字符串仅由小英文字母组成。

我想出了一种方法,可以对它们进行排序,但测试用例很紧,并且提供 TLE。

有没有更好的方法来解决这个问题。请帮忙。

【问题讨论】:

    标签: string sorting optimization


    【解决方案1】:

    是的,有两种方法。

    1. 使用HASHING

    如何使用?

    • 创建一个大小为 26 的简单整数数组 (hash[])。考虑到您的字符串仅由小字母组成,它的每个索引都将表示一个字母。
    • 将数组初始化为零。
    • 现在遍历字符串,对于字符串中出现的每个字母,在 hash[] 中将其频率加一。例如,如果 'a' 出现在字符串中,则 hash[0] = hash[0] + 1;
    • 完成上述步骤后。您将拥有哈希中的所有字符频率。
    • 现在遍历您的 hash[] 并为每个索引 i 打印所有字符,直到 hash[i] 变为零。这是因为,当您想按字典顺序对字符串进行排序时,最好的方法是print all 'a' then all 'b' and so on present in string
    • 上述方法的时间复杂度为O(n*2s)
    • 下面是程序
    int hash[26]={0};
    for( int i = 0 ; i < s.length() ; i++ ) // s.length() returns string length
    {
       hash[s[i]-97] += 1; // s[i] - 97 actually returns index for the character
    }
    char ch;
    for( int i = 0 ; i < 26 ; i++ )
    {
       ch = i+97; // making the character required
       while(hash[i]) { cout << ch; hash[i] -= 1; } // printing it its frequency times
    }
    
    1. 使用nlog(n) sorting
    • 在 C++ 中,您也可以使用 sort() 函数对字符串进行排序。

    如何?

    • 只要写sort( s.begin() , s.end() ) ;
    • 此方法的复杂度为 O(n*|s|log(|s|))
    • 代码如下
    string s;
    cin >> s;
    sort( s.begin(); s.end() );
    cout << s << endl;
    

    【讨论】:

    • 非常感谢。我不知道我们也可以在字符串中使用 sort()。我正在使用 O(n^2) 排序并获取 TLE。
    • 我使用了这两种方法并得到了所有正确的方法,非常感谢您提供如此好的答案。
    • 你开始竞技编程了吗?
    • 是的,我刚刚开始。
    • 去我的博文了解什么是CP? code-with-ease.blogspot.com/2020/04/…希望对你有帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2023-01-21
    • 2014-02-08
    相关资源
    最近更新 更多