交换字符使得字符串相同[贪心]

news2024/9/29 5:31:08

贪心

  • 前言
  • 一、交换字符使得字符串相同
  • 二、贪心
    • 1、分析问题的思路过程
    • 2、go
  • 总结
  • 参考资料

前言

贪心算法,必须先看清楚有哪些选择,才能在这些选择的基础上进行贪心,做最优选择,除此之外,还得看局部最优会不会形成全局最优,否则无法贪心。

一、交换字符使得字符串相同

在这里插入图片描述

二、贪心

1、分析问题的思路过程

有两个问题很重要,
1.如何交换才能使两字符串相同,有哪些交换方式?
2.要想交换次数最少,选择何种方式能快点交换?
问题1)相同的字符肯定不用动,不同的字符对上下交换是无意义的,这能进行两个不同对的交叉交换。
问题2)
当两对字符对相同性质时,如y-x | y - x,一次交叉交换就能让2对字符相同,这是贪心点,是最优选择。
当两对字符对不同性质时,如y - x | x - y,一次交叉交换是不行的,得先做一次无意义的上下交换,转换成相同性质对y - x | y - x,再做一次交叉换,一共两次,这必定是次优选择。

2、go

func minimumSwap(s1 string, s2 string) int {
    x,y := 0,0
    for i := 0;i < len(s1);i++ {
        if s1[i] != s2[i] {
            if s1[i] == 'x' {
                x++
            }
            if s1[i] == 'y' {
                y++
            }
        }
    }
    // 要么两个都剩下x/y,要么都不剩,否则出现单对x/y,则无法交换成功。
    if x & 1 != y & 1 {
        return -1
    }
    return (x + 1) >> 1 + (y + 1) >> 1
}
// 寻找最小交换次数
// 当x/y的数量为奇数时,一定无法交换成功。
// 抽象,我们思考中有这个交换过程,但是结果只要交换次数,不需要具体交换过程。
// xxyy yyxx
// 不仅要理解如何交换,还得理解怎么交换更快是两字符串相同?
// x x y y x y x y x x
// x y y x y x x x y x
// 不位置不同的字符提取出来
// x y x y y x
// y x y x x y
// 上下不同,上下交换也还是不同,只能对角线交换,当不同的字符是一对时(y / x,y / x),对角线交换xy即可。
// 记录不同的x/y个数,return (x + 1) >> 1 + (y + 1) >> 1
// 经过上述分析,问题就转换成记录x/y的个数,然后各子折半取上整的总和,按照贪心的做法,一次交换尽量解决两对同性质的x/y对,最后剩下的就需要交换两次,所以取上整。

总结

1)思考问题,得有一个分析的过程,最好写下来,有助于后面的逐步分析。
2)对于贪心问题,首先得知道选择有哪些,否则无从贪起,就像这里,必须知道如何交换字符串才能得到相同字符串,知道其中的交换方式有两种,才能贪心的交换。

参考资料

[1] LeetCode 交换字符使得字符串相同

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

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

相关文章

8 百度接口

0 建议学时 2学时 1 简介 百度人工智能平台-站在巨人的肩膀上 https://ai.baidu.com/ 控制台->立即注册 百度人工智能平台 APP Key 和 Secret Key AI接入指南 https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjgn3 百度智能云视频参考 https://abcxueyuan.baidu.com/#/…

2023年最新详细教程!手把手教你搭建Hexo + GitLab个人博客

文章目录前言一、安装和配置环境1.安装 Git2.安装 Node.js二、新建博客项目1.GitLab配置CI/CD自动化部署1.1 GitLab新建项目1.2 GitLab自建Runners1.2.1 下载gitlab-runner1.2.2 注册Runners1.2.3 安装Runners并启动1.3 添加.gitlab-ci.yml文件2.拉取和推送hexo blog2.1 拉取he…

基于遗传算法的配电网故障定位(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

sonarqube 外部扫描器 go vet golangci-lint 无法导入问题

首先&#xff0c;请看[外部分析报告]各种语言的报告生成 go vet 2> govet-report.out#没有golangci-lint&#xff0c;我从网上找到了 golangci-lint run --out-format checkstyle ./... > golangci-lint-report.xml值得注意的是&#xff0c;貌似不支持目录&#xff0c;仅…

6.2 负反馈放大电路的四种基本组态

通常&#xff0c;引入交流负反馈的放大电路称为负反馈放大电路。 一、负反馈放大电路分析要点 如图6.2.1(a)所示电路中引入了交流负反馈&#xff0c;输出电压 uOu_OuO​ 的全部作为反馈电压作用于集成运放的反向输入端。在输入电压 uIu_IuI​ 不变的情况下&#xff0c;若由于…

mysys2+minGW方案编译ffmpeg的最佳实践

一、Win10 64bit编译环境的建立1&#xff09;从http://www.msys2.org/下载 msys2-x86_64-xxx.exe2&#xff09; 安装msys2到默认路径 C:\msys64\3&#xff09; 运行MSYS2 w644&#xff09;执行 pacman -Syu 更新系统当出现提示时&#xff0c;选择y5) 当窗口关闭时&#xff0c;重…

JavaScript函数

目录 定义函数 调用函数 函数参数 函数返回值 匿名函数 箭头函数 使用JavaScript编程时&#xff0c;函数是一种非常有用的编程结构&#xff0c;用于执行特定的任务并返回结果。函数可以重复使用&#xff0c;因此您只需编写一次代码&#xff0c;即可在需要时多次调用该代码…

深入解析dubbo的延迟暴露

一、引子 最近搭建了一个新的Java工程&#xff0c;主要是提供dubbo服务给其他业务用的。突然想起之前dubbo服务都会配置延迟暴露来解决平滑发布的问题&#xff0c;但是好像现在新的Java项目都没有配置延迟暴露了&#xff0c;觉得很奇怪&#xff0c;所以去研究了一下关于dubbo延…

Delete `␍`eslint(prettier/prettier) in vscode 的解决方案

错误描述从 Github 仓库拉取代码&#xff0c;使用 vscode 打开&#xff0c;页面报错&#xff0c;每一行都爆红 &#xff08;如下图&#xff09;问题原因由于历史原因&#xff0c;windows下和linux下的文本文件的换行符不一致。Windows在换行的时候&#xff0c;使用了换行符CRLF…

ROG配置ubuntu20.04.5双系统要点

win11ubuntu20.04.5 1. BIOS设置 开机长按F2进入bios设置&#xff0c;修改advanced参数&#xff1a; boot -> 关闭fast bootsecurity -> 关闭secure boot设置VMD controller为Disabled&#xff08;其他电脑是修改硬盘的SATA和ACHI模式&#xff09;。但是改了之后windo…

【大数据离线开发】8.1 Hive介绍和架构

Hive&#xff1a;数据分析引擎 了解 大数据的终极目标: 使用SQL语句来处理大数据 Hadoop的体系架构中: Hive:支持SOLPig:支持PiqLatin Spark的体系架构中: Spark SQL:类似Hive&#xff0c;支持SOL、支持DSL 另一个&#xff1a;Impala 8.1 什么是Hive&#xff1f; 起源自f…

Linux 离线安装Ruby和RubyGems环境

文章目录简介1. 安装GCC环境2. 安装ruby3. 安装 RubyGems4. 安装 redis-xxx.gem提示&#xff1a;以下是本篇文章正文内容&#xff0c;Redis系列学习将会持续更新 简介 在学习 Redis 集群对这几个词的概念和关系感混乱&#xff0c;故在此对其梳理。 Ruby 是什么&#xff1f; 它…

鼠标更换指针图案和更改typora的主题

鼠标更换指针图案 由此偶然看见好几个朋友都使用了新的图案替换掉了原有的鼠标图案&#xff0c;今天寻思自己也换一个图案 主要是觉得鼠标大一点儿会好看一些&#xff0c;所以就找了一些教程 官方教程&#xff0c;小的变动 当然最多的是官方教程&#xff0c;如果你只是想要…

Web Spider Ast-Hook 浏览器内存漫游 - 数据检索

文章目录一、资源下载二、通过npm安装anyproxy模块三、anyproxy的介绍以及基本使用1. anyproxy的功能介绍2. anyproxy的基本使用四、给浏览器挂代理五、实操极验demo案例总结提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、资源下载 Github&#x…

性能优化之node中间件耗时

背景 中间件在node框架中是很基本的套件&#xff0c;使用不当很容易对页面性能造成影响。除了node服务端外&#xff0c;前端做的SSR项目也要特别重视这块 哪些场景会造成中间件耗时特别严重&#xff1f; 罪魁祸首是&#xff1a;await阻塞 举个例子&#xff1a; 1.如何得到 …

稀疏特征和密集特征

在机器学习中&#xff0c;特征是指对象、人或现象的可测量和可量化的属性或特征。特征可以大致分为两类&#xff1a;稀疏特征和密集特征。 稀疏特征 稀疏特征是那些在数据集中不连续出现的特征&#xff0c;并且大多数值为零。稀疏特征的示例包括文本文档中特定单词的存在或不存…

高性能 Message ToJavaBean 工具 【easy.server.mapper】

easy.server.mapper 介绍 后端开发中&#xff0c;消息转换常见问题 Map 中的数据 转换成实体Bean数组 中的数据 转换成实体BeanServet 中的 param 转换成实体Bean 以上的三个问题是最常见的消息转换困扰。 以Map 举例 常见做法是 手动转换 Map<String,Object> da…

stm32f407探索者开发板(二十三)——定时器中断实验

文章目录一、通用定时器知识回顾1.1 时钟的选择1.2 内部时钟的选择1.3 计数器模式二、常用寄存器和库函数配置2.1 计数器当前值寄存器CNT2.2 预分频寄存器TIMx_PSC2.3 自动重装载寄存器&#xff08;TIMx_ARR)2.4 控制寄存器1&#xff08;TIMx_CR1&#xff09;2.5 DMA中断使能寄…

基因净化车间装修设计方案SICOLAB

基因净化车间的设计方案应该根据实际需求进行定制&#xff0c;以下是一些规划建设要点和洁净设计要注意的事项&#xff1a;一、净化车间规划建设要点&#xff1a;&#xff08;1&#xff09;基因车间的面积应该根据实验项目的规模进行规划&#xff0c;包括充足的操作区域和足够的…

华为OD机试题,用 Java 解【DNA 序列】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…