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;
    }
};
相关推荐
码爸1 小时前
b树详细介绍与示例
数据结构·b树
leobertlan7 小时前
痛苦系列 | DSP-03 跨越单位圆:Z变换与零极点分析
算法·程序员
蛋蛋的就会顺顺的8 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
开发小能手1238 小时前
答案daanC语言
数据结构·算法
Navigator_Z10 小时前
LeetCode //C - 1291. Sequential Digits
c语言·算法·leetcode
WL学习笔记11 小时前
C & C++ 内存管理
c++·c++内存管理
pride.li11 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
旺仔仔仔12 小时前
机器人项目实战(5):从单次抓取,到接收指令连续做事
算法
旺仔仔仔12 小时前
机器人项目实战(2):识别物体、提取点云,再到抓取姿态
算法
姜鱼问生12 小时前
密码明明一样,为什么 GPG 说“错的“?
后端·算法·架构