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;
    }
};
相关推荐
thusloop11 分钟前
380. O(1) 时间插入、删除和获取随机元素
数据结构·算法·leetcode
MobotStone30 分钟前
无代码+AI时代,为什么你仍然需要像个开发者一样思考
人工智能·算法
緈福的街口1 小时前
【leetcode】584. 寻找用户推荐人
算法·leetcode·职场和发展
future14121 小时前
游戏开发日记
数据结构·学习·c#
今天背单词了吗9801 小时前
算法学习笔记:17.蒙特卡洛算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·笔记·考研·算法·蒙特卡洛算法
Maybyy1 小时前
力扣242.有效的字母异位词
java·javascript·leetcode
wjcurry2 小时前
完全和零一背包
数据结构·算法·leetcode
逐花归海.2 小时前
『 C++ 入门到放弃 』- 多态
开发语言·c++·笔记·程序人生
hie988942 小时前
采用最小二乘支持向量机(LSSVM)模型预测气象
算法·机器学习·支持向量机
qq_433554542 小时前
C++ 选择排序、冒泡排序、插入排序
数据结构