0
点赞
收藏
分享

微信扫一扫

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


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


文章目录

  • 题目
  • 思路
  • 解题方法
  • Code


题目

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

操作 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  ; 
    }

};


举报

相关推荐

0 条评论