1247. 交换字符使得字符串相同

news2024/11/15 11:03:41

1247. 交换字符使得字符串相同

难度中等162收藏分享切换为英文接收动态反馈

有两个长度相同的字符串 s1 和 s2,且它们其中 只含有 字符 "x" 和 "y",你需要通过「交换字符」的方式使这两个字符串相同。

每次「交换字符」的时候,你都可以在两个字符串中各选一个字符进行交换。

交换只能发生在两个不同的字符串之间,绝对不能发生在同一个字符串内部。也就是说,我们可以交换 s1[i] 和 s2[j],但不能交换 s1[i] 和 s1[j]

最后,请你返回使 s1 和 s2 相同的最小交换次数,如果没有方法能够使得这两个字符串相同,则返回 -1 。

示例 1:

输入:s1 = "xx", s2 = "yy"
输出:1
解释:
交换 s1[0] 和 s2[1],得到 s1 = "yx",s2 = "yx"。

示例 2:

输入:s1 = "xy", s2 = "yx"
输出:2
解释:
交换 s1[0] 和 s2[0],得到 s1 = "yy",s2 = "xx" 。
交换 s1[0] 和 s2[1],得到 s1 = "xy",s2 = "xy" 。
注意,你不能交换 s1[0] 和 s1[1] 使得 s1 变成 "yx",因为我们只能交换属于两个不同字符串的字符。

示例 3:

输入:s1 = "xx", s2 = "xy"
输出:-1

示例 4:

输入:s1 = "xxyyxyxyxx", s2 = "xyyxyxxxyx"
输出:4

提示:

  • 1 <= s1.length, s2.length <= 1000
  • s1, s2 只包含 'x' 或 'y'

思路:首先需要明确的一点是,如果对于索引idx,s1[idx]==s2[idx]的情况下,我们是不用动的,这样才符合我们需要的最小交换次数的要求。现在我们来看看在s1[idx]与s2[idx]不相同的情况:

A. s1[idx]=='x',s2[idx]=='y',此种情况记为xy

        如上图所示,在这种情况下,可以交换s1[idx_1]与s2[idx_2]或者交换s1[idx_2]与s2[idx_1],即将两个xy进行一次置换可以消去两个xy模式。

B. s1[idx]=='y',s2[idx]=='x',此种情况记为yx

       与上类似,这种情况可以将两个yx进行一次置换可以消去两个yx模式。

以上讨论限于都为偶数的情况,那么对于奇数情况呢?

首先必须明确的是,如果xy和yx模式的个数一个为奇数一个为偶数就不可能通过交换将两者变成相同字符串。举例来说,一个xy模式,要么使用另一个xy模式与之采用一步交换消去,要么使用yx模式与之采用两步交换消去,如果只有一个xy模式,是没有办法消去的。

xy模式与yx模式的两步消除法在题目中已经给出了例子:

输入:s1 = "xy", s2 = "yx"

输出:2

解释: 交换 s1[0] 和 s2[0],得到 s1 = "yy",s2 = "xx" 。 交换 s1[0] 和 s2[1],得到 s1 = "xy",s2 = "xy" 。 注意,你不能交换 s1[0] 和 s1[1] 使得 s1 变成 "yx",因为我们只能交换属于两个不同字符串的字符。

因此我们已经有了算法流程:

        1.统计xy、yx模式的出现次数

        2.如果xy模式和yx模式的和为奇数,势必为一个奇数一个偶数,此时一定没有办法成功交换,返回-1

        3.如果二者都为偶数,那么需要的最小交换次数为xy_num / 2 + yx_num / 2

        4.如果为两个奇数,那么需要的最小交换次数为xy_num / 2 + yx_num / 2 + 2

class Solution {
public:
    int minimumSwap(string s1, string s2) {
        if(s1.length() != s2.length()) return -1;
        int xy_num = 0, yx_num = 0, idx;
        for(idx = s1.length() - 1; idx >= 0; -- idx){
            if(s1[idx] == 'x' && s2[idx] == 'y'){
                ++ xy_num;
            }else if(s1[idx] == 'y' && s2[idx] == 'x'){
                ++ yx_num;
            }
        }
        if((xy_num + yx_num) & 1){
            return -1;
        }//必然是两个偶数或者两个奇数 如果是两个偶数则只需要各自和各自交换 如果是两个奇数 则最后+2
        return xy_num / 2 + yx_num / 2 + (xy_num & 1 ? 2 : 0);
    }
};

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

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

相关文章

轻松入门H3C无线AC上线AP【入门篇】

我们知道华三的最新模拟器支持了无线AC的配置&#xff0c;今天就浅浅的出个无线AC的教程&#xff0c;你上也会的那种。今天我们模拟的是二层环境下&#xff0c;笔者准备了2个AP&#xff0c;以此展示AP上线到AC的教程&#xff0c;并且用手机测试WiFi连接正常&#xff0c;且客户端…

7、nodejs安装

前言&#xff1a;工具下载地址阿里云盘&#xff1a;nodejs&#xff1a;https://www.aliyundrive.com/s/hLAKBgjNUqr提取码: p9q9一、介绍Node.js发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;使用了一个事件…

【VUE】二 vue指令

目录 一、插值表达式 二、v-bind指令(对标签中的属性进行操作) 三、v-model指令&#xff08;input、select、textarea等。【双向绑定】&#xff09; 四、v-for循环指令 五、v-on(事件指令) 六、v-if条件判断 七、v-show&#xff08;条件显示或隐藏&#xff09; 八、案例…

模型解释性:PFI、PDP、ICE等包的用法

本篇主要介绍几种其他较常用的模型解释性方法。 1. Permutation Feature Importance(PFI) 1.1 算法原理 置换特征重要性(Permutation Feature Importance)的概念很简单&#xff0c;其衡量特征重要性的方法如下&#xff1a;计算特征改变后模型预测误差的增加。如果打乱该特征的…

HCIP-5距离矢量路由协议RIP学习笔记

前言 路由信息协议RIP&#xff08;Routing Information Protocol&#xff09;的简称&#xff0c;它是一种基于距离矢量&#xff08;Distance-Vector&#xff09;算法的协议&#xff0c;使用跳数作为度量来衡量到达目的网络的距离。RIP主要应用于规模较小的网络中。Rip是第一个动…

如何创建“杀手级”SaaS 产品文档?

SaaS 产品的文档至关重要&#xff0c;尽管在 SaaS 初创公司的旋风中&#xff0c;它可能在您的列表中并不重要。它不仅仅是为客户支持节省成本。您可能已经在发布一些文档时做了一些尝试&#xff0c;但现在是时候将您的文档提升到一个新的水平了。由于 SaaS 公司采用订阅模式运营…

【Git】Git使用(保姆级讲解)

1、第一次安装使用 git下载地址&#xff1a;https://git-scm.com/download 1.1 配置用户名、邮箱 ​ 这是非常重要的&#xff0c;因为每次Git提交都会使用该用户信息。 设置 ​ 在 git bash 输入以下命令。 git config --global user.name "" git config --glo…

CV学习笔记-ResNet

ResNet 文章目录ResNet1. ResNet概述1.1 常见卷积神经网络1.2 ResNet提出背景2. ResNet网络结构2.1 Residual net2.2 残差神经单元2.3 Shortcut2.4 ResNet50网络结构3. 代码实现3.1 Identity Block3.2 Conv Block3.3 ResNet网络定义3.4 整体代码测试1. ResNet概述 1.1 常见卷积…

【三维几何学习】MeshCNN: A Network with an Edge

MeshCNN引言一、方法简述1.1 输入1.2 卷积1.3 池化二、实验分析三、改进以及应用引言 MeshCNN是第一个将网格简化引入到池化操作中的网络&#xff1a;合并顶点降低网格分辨率&#xff0c;类似图像中的平均池化。 主页1:https://ranahanocka.github.io/MeshCNN/ 比较详细的讲解…

Java 练习题:输出纯素数

文章目录纯素数简介任务要求思路解析源码奉上运行效果总结纯素数简介 所谓纯素数就是该数本身不仅是素数&#xff0c;并且该数的每一位都是素数。 例如&#xff1a;23,37是纯素数&#xff0c;但13,29不是。 任务要求 输出55555内所有的纯素数&#xff0c;按每行20个的格式化…

JVM 学习(2)—简单理解Java 四大引用(强、软、弱、虚)

一、Java 引用概述 Java 中出现四种引用是为了更加灵活地管理对象的生命周期&#xff0c;以便在不同场景下灵活地处理对象的回收问题。不同类型的引用在垃圾回收时的处理方式不同&#xff0c;可以用来实现不同的垃圾回收策略。Java 目前将其分成四类&#xff0c;类图如下&…

彻底搞懂inner join,left join,right join

1.inner join A inner join B where 条件&#xff0c; 对于A表中的每一行都会去B表的所有行去查找&#xff0c;去匹配&#xff0c;符合条件的就将这两行连接起来 下面用一个例子来帮助实际理解这句话&#xff1a; 创建下面两个表&#xff0c;customers表orders表 输入以下s…

银行软件测试面试题目总结,希望可以帮到你

目录 一、根据题目要求写出具体LINUX操作命令 二、JMETER题目 三、根据题目要求写出具体SQL语句 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一、根据题目要求写出具体LINUX操作命令 1、分别写出一种…

HTML标签——列表标签 之 自定义列表

HTML标签——列表标签 之 自定义列表 目录HTML标签——列表标签 之 自定义列表一、 场景&#xff1a;在网页的底部导航中通常会使用自定义列表实现。二、标签组成&#xff1a;三、案例实操四、运行效果五、显示特点&#xff1a;六、注意点&#xff1a;七、小结一、 场景&#x…

DeepPath: A Reinforcement Learning Method forKnowledge Graph Reasoning

Innovation使用RL学习KG中的关系路径推理使用Supervised Policy Learning解决&#xff1a;KG中关系图大&#xff0c;如试错训练RL&#xff0c;难以收敛使用双向路径搜索&#xff0c;减少中间节点数量IntroductionPRA是一种学习推理路径的方法&#xff0c;使用基于RandomWalk的重…

智能语音信息处理团队18篇论文被语音技术顶会ICASSP 2023接收

近日&#xff0c;ICASSP 2023会议发出了审稿结果通知&#xff0c;语音及语言信息处理国家工程研究中心智能语音信息处理团队共18篇论文被会议接收&#xff0c;论文方向涵盖语音识别、语音合成、话者识别、语音增强、情感识别、声音事件检测等&#xff0c;各接收论文简介见后文。…

FreeRTOS入门(05):事件组

文章目录目的基础说明相关函数使用演示总结目的 事件组是RTOS中相对常用的用于任务间交互的功能&#xff0c;这篇文章将对相关内容做个介绍。 本文代码测试环境见前面的文章&#xff1a;《FreeRTOS入门&#xff08;01&#xff09;&#xff1a;基础说明与使用演示》 基础说明…

华为OD机试模拟题 用 C++ 实现 - 寻找连续区间(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明寻找连续区间题目输入输出示例一输入输出说明示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率…

嵌入式环境配置—VMware 软件安装和虚拟机的创建

目录 一、VMware软件的安装 二、虚拟机的创建 三、Linux操作系统的安装 VMware软件的安装 为什么要虚拟机? 嵌入式Linux开发需要在Linux系统下进行&#xff0c;我们选择了Ubuntu。 1.双系统安装 有问题&#xff0c;一次只能使用一个系统。Ubuntu基本只做编译用。需求&…

Qt之QTableView自定义排序/过滤(QSortFilterProxyModel实现,含源码+注释)

一、效果示例图 1.1 自定义表格排序示例图 本文过滤条件为行索引取余2等于0时返回true&#xff0c;且从下图中可以看到&#xff0c;奇偶行是各自挨在一起的。 1.2 自定义表格过滤示例图 下图添加两列条件&#xff08;当前数据大于当前列条件才返回true&#xff0c;且多个列…