Determine if Two Strings Are Close (M)
题目
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
- For example,
-
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"
Example 4:
Input: word1 = "cabbba", word2 = "aabbss"
Output: false
Explanation: It is impossible to attain word2 from word1, or vice versa, in any amount of operations.
Constraints:
1 <= word1.length, word2.length <= 10^5
word1
andword2
contain only lowercase English letters.
题意
按指定规则判断两个字符串是否近似。
思路
根据规则可以得到三点信息:
- 两字符串长度必须相等;
- 两字符串中出现的字母种类必须相同;
- 两字符串中所有字母的出现次数排序后必须相同。
代码实现
Java
class Solution {
public boolean closeStrings(String word1, String word2) {
if (word1.length() != word2.length()) {
return false;
}
int[] hash1 = new int[26], hash2 = new int[26];
for (int i = 0; i < word1.length(); i++) {
hash1[word1.charAt(i) - 'a']++;
hash2[word2.charAt(i) - 'a']++;
}
for (int i = 0; i < 26; i++) {
if (hash1[i] > 0 && hash2[i] == 0 || hash1[i] == 0 && hash2[i] > 0) {
return false;
}
}
Arrays.sort(hash1);
Arrays.sort(hash2);
for (int i = 0; i < 26; i++) {
if (hash1[i] != hash2[i]) {
return false;
}
}
return true;
}
}