[Algorithm][综合训练][mari和shiny][重排字符串]详细讲解

2024-08-25 07:36

本文主要是介绍[Algorithm][综合训练][mari和shiny][重排字符串]详细讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1.mari和shiny
    • 1.题目链接
    • 2.算法原理详解 && 代码实现
  • 2.重排字符串
    • 1.题目链接
    • 2.算法原理详解 && 代码实现


1.mari和shiny

1.题目链接

  • mari和shiny

2.算法原理详解 && 代码实现

  • 自己的版本:三层循环暴力枚举 --> 超时 --> 40%

    #include <iostream>
    #include <string>
    using namespace std;int main()
    {int n = 0, cnt = 0;cin >> n;string str;cin >> str;// 三层暴力枚举for(int i = 0; i < n - 2; i++){if(str[i] != 's'){continue;}for(int j = i + 1; j < n - 1; j++){if(str[j] != 'h'){continue;}for(int k = j + 1; k < n; k++){if(str[k] != 'y'){continue;}else{cnt++;}}}}cout << cnt << endl;return 0;
    }
    
  • 优化版本:动态规划 – 多状态的线性dp

    • 状态表示

      • s[i][0, i]区间内,有多少个"s"
      • h[i][0, i]区间内,有多少个"sh"
      • y[i][0, i]区间内,有多少个"shy"
    • 状态转移方程
      请添加图片描述

    • 初始化s[0] = str[0] == 's' ? 1 : 0, h[0] = y[0] = 0;

    • 空间优化
      请添加图片描述

    #include <iostream>
    #include <string>
    using namespace std;int main()
    {int n = 0;string str;cin >> n >> str;long long s = 0, h = 0, y = 0;for(int i = 0; i < n; i++){char ch = str[i];if(ch == 's'){s++;}else if(ch == 'h'){h += s;}else if(ch == 'y'){y += h;}}cout << y << endl;return 0;
    }
    

2.重排字符串

1.题目链接

  • 重排字符串

2.算法原理详解 && 代码实现

  • 自己的版本:33.33%
    #include <iostream>
    #include <string>
    #include <unordered_set>
    #include <unordered_map>
    using namespace std;int main()
    {int n = 0;string str;cin >> n >> str;unordered_map<char, int> hash;unordered_set<char> deDup;int maxLen = 0;char maxCh = 'a';for(const auto& ch : str){deDup.insert(ch);hash[ch]++;int tmp = max(maxLen, hash[ch]);if(tmp > maxLen){maxLen = tmp;maxCh = ch;}}bool flag = true;if(maxLen > n / 2 + 1){flag = false;cout << "no" << endl; // 一个字符串的数量如果超过n / 2 + 1,则肯定不可以}// 到这里之后,肯定都是可以的// 这里的重组方法有失偏颇string ret;ret += maxCh, hash[maxCh]--;while(!hash.empty()){for(const auto& ch : deDup){if(hash.count(ch)){ret += ch;hash[ch]--;if(hash[ch] == 0){hash.erase(ch);}}}}if(flag){cout << "yes" << endl<< ret << endl;}return 0;
    }
    
  • 优化版本:贪心 + 构造
    • 不能重排 x > ( n + 1 ) / 2 x > (n + 1) / 2 x>(n+1)/2
    • 能重排
      • 每次去处理一批相同的字符 --> [自己的版本没意识到的思路]
      • 优先处理出现次数最多的字符
      • 每次摆放的时候,间隔一个格子
      • 重点:手动控制间隔 --> [自己的版本没能实现的]
    #include <iostream>
    #include <string>
    #include <unordered_map>
    using namespace std;int main()
    {int n = 0;string str;cin >> n >> str;unordered_map<char, int> hash;int maxLen = 0;char maxCh = 'a';for(const auto& ch : str){if(++hash[ch] > maxLen){maxLen = hash[ch];maxCh = ch;}}if(maxLen > (n + 1) / 2){cout << "no" << endl;}else{int index = 0;string ret;ret.resize(n);// 先去拜访出现次数最多的while(maxLen--){ret[index] = maxCh;index += 2;}hash.erase(maxCh);// 再摆放剩下的for(auto& it : hash){if(it.second){while(it.second--){if(index >= n){index = 1;}ret[index] = it.first;index += 2;}}}cout << "yes" << endl<< ret << endl;}return 0;
    }
    

这篇关于[Algorithm][综合训练][mari和shiny][重排字符串]详细讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104940

相关文章

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引