Leetcode 周赛题解 215

本文解析了LeetCode周赛中的两道题目,5603. 确定两个字符串是否接近和5602. 将x减到0的最小操作数。对于5603题,关键在于理解操作后的字符数量排序不变;5602题则可通过前缀和转换成寻找子数组和问题。转换题意是解题关键,提高了解题效率和代码可读性。
摘要由CSDN通过智能技术生成

今天的leetcode最后一题是动态规划,比较难,适合对DP比较熟练的童鞋去完成,讲起来也比较费劲,这里就只讲下第二道和第三道题,第一道水题略过。

5603. 确定两个字符串是否接近

题目内容:

如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :

操作 1:交换任意两个 现有 字符。

例如,abcde -> aecdb

操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。

例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a )

你可以根据需要对任意一个字符串多次使用这两种操作。

给你两个字符串,word1 和 word2 。如果 word1 和 word2 接近 ,就返回 true ;否则,返回 false 。

解题思路:

刚开始看题目差点用DP的思路去解题,仔细思考后发现这道题是有规律的。

这道题输入2个字符串a和b,看是否能从a通过操作1、2转换为b。

对于操作1,任意交换2个现有字符,不管怎样交换,字符串里面的字符不会变化,也就是说,a和b的长度肯定是一样的,并且拥有的字符集也一样。

对于操作2,可以转换任意2个类型的字符,那么这里转换后,每个字符的数量按大小排序后是不变的,只要保证2个字符串中字符数量一致,那么就可以转换。

代码如下:

class Solution {
   
public:
    bool closeStrings(string word1, string word2) {
   
        if(word1.length() != word2.length()){
   
            return false;
        }

        std::vector<int> w1(26);
        std::vector<int> w2(26);
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值