C++找出字符串中出现最多的字符和次数,时间复杂度小于O(n^2)

题目描述

给定一个包含n个字符的字符串S,请你编写一个复杂度小于O(n^2)的算法,找出字符串S中出现最多的字符和次数。

思路分析

本题可以采用哈希表来实现。具体的做法是,在扫描整个字符串的过程中记录下每个字符出现的次数,然后遍历所有字符,找出出现次数最多的字符即可。

遍历字符串的时间复杂度为O(n),统计每个字符出现次数的过程为O(n),遍历哈希表找到出现次数最多的字符也是O(n)的。因此总的时间复杂度为O(n)。

代码实现

下面给出C++的代码实现:

#include <iostream>
#include <unordered_map>
#include <string>

using namespace std;

int main()
{
    string s = "Hello, World!";
    unordered_map<char, int> cnt_map;

    for (char c : s) {
        cnt_map[c]++;
    }

    char max_char = 0;
    int max_cnt = 0;
    for (auto p : cnt_map) {
        if (p.second > max_cnt) {
            max_cnt = p.second;
            max_char = p.first;
        }
    }

    cout << "Max char: " << max_char << endl;
    cout << "Max cnt: " << max_cnt << endl;

    return 0;
}

示例1:

给定字符串“Hello, World!”,它中出现最多的字符是字符‘l’,出现次数为3。我们可以使用上述代码来验证:

Max char: l
Max cnt: 3

示例2:

然后再给一个稍微复杂一点的字符串:“This is a test sentence to see if our code works properly or not.”,它中出现最多的字符为字符‘ ’(空格),出现次数为11。我们可以使用上述代码来验证:

Max char:
Max cnt: 11

总结

本文介绍了使用哈希表来解决C++中找出字符串中出现最多的字符和次数的问题,并给出了代码实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++找出字符串中出现最多的字符和次数,时间复杂度小于O(n^2) - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • Spring Boot全局异常处理解析

    下面是关于Spring Boot全局异常处理解析的完整攻略,包括了详细的讲解和示例说明。 什么是全局异常处理 在 Spring Boot 中,我们可以使用 @ControllerAdvice 注解来定义一些全局的异常处理方法,这些方法可以捕获到应用程序中可能出现的异常,并进行特定的处理。全局异常处理能够提供更友好的错误信息,方便开发人员和用户进行错误排查和解…

    C 2023年5月23日
    00
  • 如何用C语言画一个“圣诞树”

    下面是如何用C语言画一个圣诞树的攻略: 步骤一:准备工作 新建一个C语言文件,例如“christmas_tree.c”; 导入所需的头文件; 示例代码: #include<stdio.h> #include<windows.h> 步骤二:绘制圣诞树的主体 定义圣诞树的高度和底部宽度,例如height和width; 循环绘制每一行的叶子…

    C 2023年5月23日
    00
  • C语言实现文件读写功能流程

    C语言可以通过文件读写功能来读取文件中的数据内容或者将程序的数据写入到文件中,以实现数据的持久化操作。下面是C语言实现文件读写功能的完整攻略,包括文件读操作和文件写操作。 文件读操作 1. 打开文件 使用fopen函数打开文件,函数原型如下: FILE *fopen(const char *filename, const char *mode); filen…

    C 2023年5月23日
    00
  • 浅谈C#中List对象的深度拷贝问题

    首先我们先介绍一下深度拷贝和浅拷贝的概念。 浅拷贝是指直接复制对象的指针,两个对象指向同一个内存地址,当一个对象改变时,另一个对象也会一起改变。 深度拷贝是指复制一个对象,重新分配一块内存地址给新的对象,两个对象的内存地址不同,修改其中一个对象不会影响另一个对象。 在C#中,List对象是一个常用的集合,我们来拿它作为例子进行说明。 如何实现List对象的深…

    C 2023年5月22日
    00
  • 荣耀畅玩7c怎么截长屏?荣耀畅玩7c滚动截屏教程

    荣耀畅玩7c怎么截长屏? 在荣耀畅玩7c中,想要截取整个长页面时,需要使用滚动截屏的功能。下面是具体的操作步骤: 打开你需要截屏的页面,滚动到页面最顶部; 按下电源键和音量减键同时按住,直到屏幕闪一下; 这时候就已经完成了第一张截屏,继续向下滚动,直到滑动到要截屏的最下面的部分; 继续按下电源键和音量减键同时按住,直到屏幕闪一下,即可完成整个页面的截屏。 需…

    C 2023年5月23日
    00
  • C语言实现栈的示例详解

    C语言实现栈的示例详解 栈(Stack)是一种非常重要的数据结构,在许多编程语言中都有广泛的应用。在C语言中,我们可以利用数组来实现栈数据结构。下面将介绍C语言实现栈的示例详解。 栈的结构 栈是一种线性数据结构,它具有以下特点: 后进先出(LIFO):最后压入栈的元素最先出栈; 插入(入栈)和删除(出栈)操作都在栈顶进行。 示意图如下: |_______| …

    C 2023年5月23日
    00
  • C++入门浅谈之类和对象

    C++入门浅谈之类和对象 什么是类和对象? 在 C++ 中,类是一种用户自定义的数据类型,它可以包含数据成员(属性)和成员函数(方法)。对象是类的实例化,即通过类来创建出来的一个具体的变量。 类的定义 定义一个类,可以使用以下的语法结构: class ClassName { private: // 私有成员变量 int privateVar; public:…

    C 2023年5月22日
    00
  • C语言指针算术运算和结构体

    C语言指针算术运算和结构体 指针算术运算 指针算术运算是指对指针变量进行加、减等运算。指针运算只有针对的是拥有某种类型的指针时才是有意义的,而且仅有两个指针的差异才有实际意义。指针变量与整数值进行运算时,整数值被转换为指向相应元素的指针。 以下是一些指针算术运算的示例: 1. 指针的加法运算 #include <stdio.h> int main…

    C 2023年5月10日
    00
合作推广
合作推广
分享本页
返回顶部