[LeetCode] 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.
确定两个字符串是否接近。
如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :
操作 1:交换任意两个 现有 字符。
例如,abcde -> aecdb
操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。
例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a )
你可以根据需要对任意一个字符串多次使用这两种操作。
给你两个字符串,word1 和 word2 。如果 word1 和 word2 接近 ,就返回 true ;否则,返回 false 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/determine-if-two-strings-are-close
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
思路是贪心。这道题按照给的两种操作来判断,注意标红的条件,这两种操作可以被执行多次。
先说操作 1,如果要满足交换任意两个字符 char,使得 A 变成 B,那么这两个被交换的字符的出现次数一定要相同才行,也就是说在字符串 A 中如果你要替换某个字母 x,那么在字符串 B 中相同 index 位置上的那个字母 y 的出现次数要跟 x 相同才行。
对于操作 2,如果要满足将一个现有字符替换成另一个现有字符,比如题目给的例子,那么需要满足第一个字符串中 a 的数量 = 第二个字符串中 b 的数量,同时第一个字符串中 b 的数量 = 第二个字符串中 a 的数量。这两个条件转化成代码就是检查两个字符串中所有出现过的字母的数量是不是能一一对应(字母不一定相同)。参见这个例子,如果所有出现的字母的次数在排序后能对的上,则执行操作 2 就能满足题意。
复杂度
时间O(nlogn)
空间O(n)
代码
Java实现
1 |
|