📜  门|门CS 2008 |第 40 题(1)

📅  最后修改于: 2023-12-03 14:58:36.710000             🧑  作者: Mango

题目介绍:门|门CS 2008 |第 40 题

本题要求编写一个程序,根据输入的字符串,从中判断是否存在某个子串出现超过一半以上。

输入格式
  • 一行字符串,长度不超过 $10^5$,只包含小写字母。
输出格式
  • 若存在某个子串出现超过一半以上,则输出该子串;
  • 若不存在任何子串出现超过一半以上,则输出 $None$。
解题思路

本题需要考虑空间复杂度,因此,我们可以用哈希表来记录每个子串的出现次数。具体实现中,我们可以使用 $unordered_map$ 来作为哈希表,实现字符串到出现次数的映射。对于每个子串,记录其出现次数,如果出现次数超过了字符串长度的一半,就可以得到该子串。

代码实现
#include <iostream>
#include <unordered_map>
#include <string>

using namespace std;

int main() {
    string str;
    cin >> str;
    int n = str.size();

    unordered_map<string, int> mp;

    for (int i = 0; i < n; i++) {
        for (int j = 1; j <= n - i; j++) {
            string temp = str.substr(i, j);
            mp[temp]++;
            if (mp[temp] > n / 2) {
                cout << temp << endl;
                return 0;
            }
        }
    }

    cout << "None" << endl;
    return 0;
}
总结

本题考查的是字符串的枚举和哈希表的使用,通过对题目的分析和对解题思路的理解,可以帮助我们更好地理解字符串和哈希表相关的知识点。