LeetCode75——Day22

文章目录

一、题目

1657. Determine if Two Strings Are Close

Two strings are considered close if you can attain one from the other using the following operations:

Operation 1: Swap any two existing characters.

For example, abcde -> aecdb

Operation 2: Transform every occurrence of one existing character into another existing character, and do the same with the other character.

For example, aacabb -> bbcbaa (all a's turn into b's, and all b's turn into a's)

You can use the operations on either string as many times as necessary.

Given two strings, word1 and word2, return true if word1 and word2 are close, and false otherwise.

Example 1:

Input: word1 = "abc", word2 = "bca"

Output: true

Explanation: You can attain word2 from word1 in 2 operations.

Apply Operation 1: "abc" -> "acb"

Apply Operation 1: "acb" -> "bca"

Example 2:

Input: word1 = "a", word2 = "aa"

Output: false

Explanation: It is impossible to attain word2 from word1, or vice versa, in any number of operations.

Example 3:

Input: word1 = "cabbba", word2 = "abbccc"

Output: true

Explanation: You can attain word2 from word1 in 3 operations.

Apply Operation 1: "cabbba" -> "caabbb"

Apply Operation 2: "caabbb" -> "baaccc"

Apply Operation 2: "baaccc" -> "abbccc"

Constraints:

1 <= word1.length, word2.length <= 105

word1 and word2 contain only lowercase English letters.

题目来源: leetcode

二、题解

当两个字符串,所拥有的共同字符类型完全相同,且字母出现数目以及出现该数目的个数完全相同时,这两个字符串是close的。

cpp 复制代码
class Solution {
public:
    bool closeStrings(string word1, string word2) {
        int n1 = word1.length();
        int n2 = word2.length();
        vector<int> map1(26,0);
        vector<int> map2(26,0);
        vector<int> times(max(n1,n2) + 1,0);
        for(int i = 0;i < n1;i++) map1[word1[i] - 'a']++;
        for(int i = 0;i < n2;i++) map2[word2[i] - 'a']++;
        //如果有字母不在交集中
        for(int i = 0;i < 26;i++){
            if((map1[i] == 0 && map2[i] != 0) || (map1[i] != 0 && map2[i] == 0)) return false;
        }
        //统计出现次数的个数
        for(int i = 0;i < 26;i++){
            if(map1[i] != 0) {
                times[map1[i]]++;   
            }
        }
        for(int i = 0;i < 26;i++){
            if(map2[i] != 0) times[map2[i]]--;
            if(times[map2[i]] < 0) return false;
        }
        return true;
    }
};
相关推荐
To_OC2 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_841495642 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
fqbqrr3 小时前
2607C++,soui与安卓
c++·soui
fqbqrr6 小时前
2607C++,使用微软detours勾挂工具
c++
爱刷碗的苏泓舒7 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
蓝悦无人机9 小时前
C++基础 — 函数总结
开发语言·c++
烬羽9 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米9 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
WL学习笔记10 小时前
堆(数据结构)
数据结构·