1657 - Determine If Two Strings Are Close (Medium)
Problem Link
https://leetcode.com/problems/determine-if-two-strings-are-close/
Problem Statement
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
(alla's
turn intob's
, and allb's
turn intoa'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:
word1
andword2
contain only lowercase English letters.
Approach 1: Comparing the strings (length, frequency and existing characters)
A possible solution can be based on three main checks:
-
Making sure both strings and have the same length as neither operation would work correctly if they had different lengths.
-
Checking if the occurrences of each characters frequency are the same for both strings. For example, and have the same number of occurrences in their character frequencies or, in other words, the same frequency of frequencies. So the characters frequency of would be and the frequency of its frequencies would be . For the characters frequency would be and its frequency of frequencies would be the same as , .
-
The last one is checking if all existing characters in one string also exist in the other string. For example, and attend the second check related to the characters frequency. However the strings are not composed of the same characters ('z' doesn't exist in just as 'c' doesn't exist in ) and this is something that none of the operations described in the problem statement can solve.
- Python
- C++
from collections import Counter
class Solution:
def closeStrings(self, word1: str, word2: str) -> bool:
return (
len(word1) == len(word2) and
Counter(Counter(word1).values()) == Counter(Counter(word2).values()) and
set([*word1]) == set([*word2])
)
class Solution {
public:
bool closeStrings(string word1, string word2) {
vector<int> cnt1(26, 0), cnt2(26, 0);
set<int> s1, s2;
for (auto x : word1) cnt1[x - 'a']++, s1.insert(x - 'a');
for (auto x : word2) cnt2[x - 'a']++, s2.insert(x - 'a');
if (cnt1 != cnt2 && s1 != s2) return false;
sort(cnt1.begin(), cnt1.end());
sort(cnt2.begin(), cnt2.end());
return cnt1 == cnt2;
}
};
Time Complexity:
The time complexity for this solution is as the algorithm execution time increases or decreases according to the strings length.
Space Complexity:
The space complexity for this solution is also .