1657. 确定两个字符串是否接近(排序)

文章讲述了如何通过使用操作1和操作2来判断两个字符串word1和word2是否接近,关键在于统计字符一致性并比较字符出现次数。作者提供了使用C++实现的Solution类方法,通过set和vector结构进行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem: 1657. 确定两个字符串是否接近

题目

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

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

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

示例 1:

输入:word1 = “abc”, word2 = “bca”
输出:true
解释:2 次操作从 word1 获得 word2 。
执行操作 1:“abc” -> “acb”
执行操作 1:“acb” -> “bca”

思路

分析一下,就是统计两个字符串满足下面两个条件就可以

(1) 存在的字符一致
(2) 字符的个数一致,比如 “aaabbbbccddeeeeefffff” 3 4 2 2 5 5
“aaaaabbcccdddeeeeffff” 5 2 3 3 4 4
串1 中a有3个,b有4个,c有2个,。。。只要保证个数是一致的,字符无所谓。

解题方法

第一个条件用set维护,第二个条件用数组统计+排序比较。

Code

class Solution {
public:
    bool closeStrings(string word1, string word2) {

        // 将子串中满足 
        int n1 = word1.size() ; 
        int n2 = word2.size() ; 
        if(n1!=n2) return false ;
        // 统计是否存在的字符一致 
        vector<int> w1(26) ; 
        vector<int> w2(26) ; 
        set<char> y1; 
        set<char> y2;
        for(int i = 0; i <n1 ; i++ ) {
            y1.insert(word1[i]) ; 
            y2.insert(word2[i]) ; 
            w1[word1[i]-'a']++ ; 
            w2[word2[i]-'a']++ ; 
        }
        vector<int> s1 ; 
        vector<int> s2 ; 
        for(int i = 0 ; i<26 ; i++ ) {
            int count_word1 = w1[i] ; 
            int count_word2 = w2[i] ; 
            s1.push_back(count_word1) ; 
            s2.push_back(count_word2) ; 

        }
        // 看两个集合是否一样 

        // "aaabbbbccddeeeeefffff" 3 4 2 2 5 5 
        // "aaaaabbcccdddeeeeffff" 5 2 3 3 4 4 

        sort(s1.begin() ,s1.end()) ; 
        sort(s2.begin() ,s2.end()) ; 
        if(s1.size() != s2.size()) return false ; 

        for(int i = 0 ; i<s1.size() ; i++ ) {
            if(s1[i] !=s2[i]) return false ; 
        }
        return  y1 ==y2  ; 
    }

};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值