1657.确定两个字符串是否相近

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

操作 1 :交换任意两个 现有 字符。 例如,abcde -> aecdb
操作 2 :将一个 现有 字符的每次出现转换为另一个 现有字符,并对另一个字符执行相同的操作。 例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a )
你可以根据需要对任意一个字符串多次使用这两种操作。

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

示例 1:

输入:word1 = "abc", word2 = "bca"

输出:true

解释:2 次操作从 word1 获得 word2 。

执行操作 1:"abc" -> "acb"

执行操作 1:"acb" -> "bca"

示例 2:

输入:word1 = "a", word2 = "aa"

输出:false

解释:不管执行多少次操作,都无法从 word1 得到 word2 ,反之亦然。

示例 3:

输入:word1 = "cabbba", word2 = "abbccc"

输出:true

解释:3 次操作从 word1 获得 word2 。

执行操作 1:"cabbba" -> "caabbb"

执行操作 2:"caabbb" -> "baaccc"

执行操作 2:"baaccc" -> "abbccc"

解题思路

观察示例可以得知:
①如果两个字符串长度不相等,肯定返回false;
②两个字符串去重后的元素必须相同; 比如示例1和示例3中都有abc
③两个字符串中的元素出现的次数,按序排列,必须相同; 因为只有这样才能通过两个操作完成题目要求

所以代码思路如下:
①先判断长度是否相等,不相等返回false
②去重,排序,本文使用set容器(自带排序去重),然后若不相等,则不符合第二个要求,所以返回false
③获取每个元素的出现次数,排序,这里使用multiset容器(自带排序),然后若完全相同,则返回true,否则不符合第三点,返回false

cpp 复制代码
class Solution {
public:
    bool closeStrings(string word1, string word2) {
        //长度不同肯定false
        if(word1.length()!=word2.length()){
            return false;
        }  

        //去重
        set<char> w1;
        set<char> w2;
        for(int i=0;i<word1.length();i++){
            w1.insert(word1[i]);
        }
        for(int i=0;i<word2.length();i++){
            w2.insert(word2[i]);
        }
        if(w1!=w2){
            return false;
        }

        //获取出现次数
        multiset<int> ans1;
        multiset<int> ans2;
        for(int i:w1){
            int count=0;
            for(int j=0;j<word1.length();j++){
                if(i==word1[j]){
                    count++;
                }
            }
            ans1.insert(count);
        }
        for(int i:w2){
            int count=0;
            for(int j=0;j<word2.length();j++){
                if(i==word2[j]){
                    count++;
                }
            }
            ans2.insert(count);
        }

        return ans1==ans2;
    }
};
相关推荐
6Hzlia6 分钟前
【Hot 100 刷题计划】 LeetCode 739. 每日温度 | C++ 逆序单调栈
c++·算法·leetcode
良木生香28 分钟前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法
XWalnut1 小时前
LeetCode刷题 day16
数据结构·算法·leetcode·链表·动态规划
寒秋花开曾相惜1 小时前
(学习笔记)4.1 Y86-64指令集体系结构(4.1.4 Y86-64异常&4.1.5 Y86-64程序)
开发语言·jvm·数据结构·笔记·学习
foundbug9992 小时前
基于混合整数规划的电池容量优化 - MATLAB实现
数据结构·算法·matlab
自我意识的多元宇宙3 小时前
树、森林——树与二叉树的应用(哈夫曼树的构造)
数据结构
memcpy04 小时前
LeetCode 2452. 距离字典两次编辑以内的单词【暴力;字典树】中等
算法·leetcode·职场和发展
水蓝烟雨4 小时前
2071. 你可以安排的最多任务数目
数据结构·链表
王老师青少年编程4 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:魔法
c++·算法·贪心·csp·信奥赛·排序贪心·魔法
wearegogog1234 小时前
基于和差波束法的单脉冲测角MATLAB实现
人工智能·算法·matlab