【leetcode详解】T3137(思路详解 代码优化感悟)

news2024/9/24 23:31:31

 思路详解

        要解决这个问题,我们的大致思路是这样:找到长度为k的字符串 (记为stringA) ,统计重复次数最多的那一个,则最终对应的k周期字符串就是 [stringA * n] 的形式( n =  word.length() / k)

        要实现多对象的计数,map是一个很好的选择

 unordered_map<string, int>mp;//字符串, 出现次数

        根据上面的调整后的最终形式不难发现,stringA 还应满足位置条件,即起始位置必须在k的整数倍上。

        于是咱们的for循环就以k为递增周期

 for(int i=0; i<word.length(); i+=k)

初步的代码实现如下:

class Solution {
public:
    int minimumOperationsToMakeKPeriodic(string word, int k) {
        if(word.length() == k)  return 0;
        unordered_map<string, int>mp;
        int re = 0, mx = 1;
        string cur;
        for(int i=0; i<=word.length()-k; i+=k)
        {
			cur = word.substr(i, k);
			if(mp.find(cur) != mp.end())
			{
				mp[cur]++;
				mx = max(mx, mp[cur]);				
			}
			else{
				mp[cur] = 1;
			}
		}
		return word.length()/k - mx;		
    }
};

代码优化

        由于笔者见识太有限了,上面的代码虽AC,但双复杂度双高

        观摩了其他大佬的写法,同样的思路,不同的语法实现,提交后直接逼近双百了!

下面分享下笔者的感悟:

        笔者自己感觉,自己最开始的代码时间上吃亏在了 cur = word.substr(i, k); 这一调用.substr()函数截取长度为k字符串的操作上。同时,也增加了一个cur的存储空间,加重了空间复杂度的负担。

        更好的程序是运用了string_view类型来构建map,可以在大大减少存储空间的情况下便利某段字符串的访问

//更多关于string 和 string_view的区别的讨论,推荐参考文章:

【C++干货】高效能的 string_view 和扎实稳定的 string-CSDN博客

出色的代码见下,真是简明干练,佩服!

class Solution {
public:
    int minimumOperationsToMakeKPeriodic(string word, int k) {
        unordered_map<string_view, int>mp;
        for(int i=0; i<=word.length()-k; i+=k)
            mp[{word.c_str()+i, word.c_str()+i+k}]++;//不存在的键对应的值默认是0
		return word.length()/k - max_element(mp.begin(), mp.end(), [](auto& a, auto& b){
			return a.second < b.second;
		})->second;	//lambda表达式,相当于构建了一个cmp函数
    }
};

//关于lambda表达式的基本用法,推荐参考文章: 

【C++浅析】lambda表达式:基本结构 & 使用示例-CSDN博客

~希望对你有启发!~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2053398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】关于Java对象比较,以及优先级队列的大小堆创建你了解多少???

前言&#xff1a; &#x1f31f;&#x1f31f;Hello家人们&#xff0c;这期讲解对象的比较&#xff0c;以及优先级队列堆&#xff0c;希望你能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;http://t.csdnimg.cn/MSex7 &#x1f308;感兴趣的小伙伴看一看小编主页&…

分享一个基于SpringBoot的物品代购系统的设计与实现(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

从零开始学嵌入式技术之数字电路

一&#xff1a;数字电路基础 数字电路是现代科技和工程领域中不可或缺的基础。从计算机系统到通信设备&#xff0c;从家庭电子产品到工业自动化&#xff0c;数字电路无处不在&#xff0c;影响着我们的生活和工作。本章节旨在向读者介绍数字电路的基本概念、原理和应用&#xff…

迭代器失效

一、什么是迭代器失效 迭代器的主要作用就是让算法能够不用关心底层数据结构&#xff0c;其底层实际就是一个指针&#xff0c;或者是对指针进行了封装&#xff0c;比如&#xff1a;vector的迭代器就是原生态指针T* 。因此迭代器失效&#xff0c;实际就是迭代器底层对应指针所指…

Kubernetes之Probe探针

目录 存活、就绪和启动探针 存活探针&#xff08;Liveness Probe&#xff09; 就绪探针&#xff08;Readiness Probe&#xff09; 启动探针&#xff08;Startup Probe&#xff09; 检测方式&#xff1a; exec&#xff1a; HTTP GET&#xff1a; TCP Socket&#xff1a; …

linux DHCP和VSFTP原理与配置

目录 一、DHCP工作原理 1.1 了解DHCP服务 1.1.1 DHCP基本描述 1.1.2 使用DHCP的好处 1.1.3 DHCP的分配方式 1.2 DHCP的租约过程 1.3 使用DHCP动态配置主机地址 1.4 安装DHCP服务器 二、DHCP服务器的配置 2.1 实验环境准备 2.2 实验实战示列 三、DHCP客户端的使用 …

【数据结构】汇总八、排序算法

排序Sort 【注意】本章是 排序 的知识点汇总&#xff0c;全文1万多字&#xff0c;含有大量代码和图片&#xff0c;建议点赞收藏&#xff08;doge.png&#xff09;&#xff01;&#xff01; 【注意】在这一章&#xff0c;记录就是数据的意思。 排序可视化网站&#xff1a; D…

Python - PyQt5环境搭建与基本配置和使用教程

****前期准备&#xff1a;PyQt5以及其他组件的下载与安装 python的图形界面开发过程中&#xff0c;我们需要三个组件&#xff0c;分别是&#xff1a;PyQt5、pyqt5-tools、PyQt5Designer 一、安装 确保Python和pip已安装&#xff1a; PyQt5是基于Python的图形用户界面库&…

WEB渗透免杀篇-Bypass-AMSI

往期文章 WEB渗透免杀篇-加载器免杀-CSDN博客 WEB渗透免杀篇-分块免杀-CSDN博客 WEB渗透免杀篇-Powershell免杀-CSDN博客 WEB渗透免杀篇-Python源码免杀-CSDN博客 WEB渗透免杀篇-C#源码免杀-CSDN博客 WEB渗透免杀篇-MSFshellcode免杀-CSDN博客 WEB渗透免杀篇-Bypass-AMSI-…

【大模型从入门到精通28】开源库框架LangChain 语义搜索:高级检索策略2

这里写目录标题 利用元数据与自我查询检索器元数据作为上下文信息初始化环境并定义元数据导入必要的模块定义元数据属性 配置自我查询检索器执行带有自动元数据推断的查询实现上下文压缩设置环境导入必要的类 初始化压缩工具创建上下文压缩检索器检索压缩文档 利用元数据与自我…

Nginx--日志

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、Nginx日志介绍 nginx 有一个非常灵活的日志记录模式&#xff0c;每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module 的…

别等GPT-4o啦,国产「开源版」GPT-4o 来了!支持全模态、无障碍交流

夕小瑶科技说 原创 作者 | 谢年年 腾讯最近的多模态进展有点子“一路高歌”&#xff0c;先是腾讯元宝升级了一波多模态能力&#xff0c;就差把GPT-4o从榜一拉下来了。 最近&#xff0c;又搞了一个和GPT-4o对标的交互式多模态模型——VITA&#xff0c;而且率先开源了。 每次…

算法-IMM

trajectory-prediction程序的imm.cc中的以下代码的对应的算法原理在后面 void IMM_UKF::InputInteract() {if (std::isnan(model_pro_(0)) || std::isnan(model_pro_(1)) || std::isnan(model_pro_(2)))std::abort();if (model_pro_.sum() ! 0)model_pro_ / model_pro_.sum();…

模组卡死?五步排查法助你快速定位并解决问题!

直线模组是许多机械设备中不可或缺的组件&#xff0c;在使用过程中可能会遇到各种故障&#xff0c;卡死是模组运行过程中最常出现的现象。以下是一些常见的直线模组卡死解决方法&#xff1a; 1、模组内部可能积聚了灰尘、杂质等&#xff0c;这些物质在模组运行过程中可能进入关…

Windows系统下两个不同版本的java切换

前言&#xff1a;在电脑中&#xff0c;已经安装好了两个不同版本的java&#xff0c;为了使用CMD随意切换两个不同版本的java&#xff0c;我们通过创建批处理文件来达到目的。 假设目前电脑中存在的两个java版本分别是java8和java21。 首先&#xff0c;创建java8的批处理文件“j…

minio下载镜像地址及启动脚本

MinIO下载 | 中国镜像下载加速站https://dl.minio.org.cn/server/minio/release/linux-amd64/archive/ MinIO下载 | 中国镜像下载加速站https://dl.minio.org.cn/client/mc/release/linux-amd64/ 文档: 单节点单硬盘部署MinIO — MinIO中文文档 | MinIO Linux中文文档 启动脚…

leetcode刷题-动态规划part01

代码随想录动态规划part01|动态规划理论基础、 509. 斐波那契数、 70. 爬楼梯 、746. 使用最小花费爬楼梯 动态规划基础509. 斐波那契数70.爬楼梯746. 使用最小花费爬楼梯 动态规划基础 动规五部曲&#xff1a; dp数组以及下标的含义&#xff1a;dp[i][j] dp[i]递推公式dp数组…

大模型格局变天:Llama3.1诞生

一、Llama3.1的背景 北美时间7月23日&#xff0c;Meta公司&#xff08;原Facebook&#xff09;宣布了一项重大突破&#xff1a;开源模型Llama 3.1的正式发布。这一举措预示着AI技术的又一次飞跃&#xff0c;Llama 3.1有望成为迄今为止最强大的开源大型语言模型&#xff08;LLM&…

Startup-SBOM:一款针对RPM和APT数据库的逆向安全工具

关于Startup-SBOM Startup-SBOM是一款针对RPM和APT数据库的逆向分析与安全检测工具&#xff0c;该工具本质上是一个简单的 SBOM 实用程序&#xff0c;旨在提供正在执行的包的内部视图&#xff0c;可以帮助广大研究人员枚举所有软件包以及可执行文件、服务和版本。 该工具的流程…

Docker 部署loki日志 用于微服务

因为每次去查看日志都去登录服务器去查询相关日志文件&#xff0c;还有不同的微服务&#xff0c;不同日期的文件夹&#xff0c;超级麻烦&#xff0c;因为之前用过ELK&#xff0c;原本打算用ELK&#xff0c;在做技术调研的时候发现了一个轻量级的日志系统Loki&#xff0c;果断采…