1657. Determine if Two Strings Are Close
Description
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)
- For example,
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
andword2
contain only lowercase English letters.
Solutions
Solution: Greedy
- Time complexity: O(nlogn)
- Space complexity: O(n)
JavaScript
js
/**
* @param {string} word1
* @param {string} word2
* @return {boolean}
*/
const closeStrings = function (word1, word2) {
if (word1.length !== word2.length) return false;
const CODE_BASE = 'a'.charCodeAt(0);
const word1Count = Array.from({length: 26}).fill(0);
const word2Count = Array.from({length: 26}).fill(0);
for (let index = 0; index < word1.length; index++) {
const charCode1 = word1.charCodeAt(index);
const charCode2 = word2.charCodeAt(index);
word1Count[charCode1 - CODE_BASE] += 1;
word2Count[charCode2 - CODE_BASE] += 1;
}
for (let index = 0; index < 26; index++) {
if (word1Count[index] && !word2Count[index]) return false;
if (word2Count[index] && !word1Count[index]) return false;
}
word1Count.sort((a, b) => b - a);
word2Count.sort((a, b) => b - a);
for (let index = 0; index < 26; index++) {
if (word1Count[index] !== word2Count[index]) return false;
}
return true;
};