class Solution {
public:
bool closeStrings(string word1, string word2) {
}
};
1657. 确定两个字符串是否接近
如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :
abcde -> aecdb
aacabb -> bbcbaa
(所有 a
转化为 b
,而所有的 b
转换为 a
)你可以根据需要对任意一个字符串多次使用这两种操作。
给你两个字符串,word1
和 word2
。如果 word1
和 word2
接近 ,就返回 true
;否则,返回 false
。
示例 1:
输入:word1 = "abc", word2 = "bca" 输出:true 解释:2 次操作从 word1 获得 word2 。 执行操作 1:"abc" -> "acb" 执行操作 1:"acb" -> "bca"
示例 2:
输入:word1 = "a", word2 = "aa" 输出:false 解释:不管执行多少次操作,都无法从 word1 得到 word2 ,反之亦然。
示例 3:
输入:word1 = "cabbba", word2 = "abbccc"
输出:true
解释:3 次操作从 word1 获得 word2 。
执行操作 1:"cabbba" -> "caabbb"
执行操作 2:"
caabbb" -> "baaccc"
执行操作 2:"baaccc" -> "abbccc"
示例 4:
输入:word1 = "cabbba", word2 = "aabbss" 输出:false 解释:不管执行多少次操作,都无法从 word1 得到 word2 ,反之亦然。
提示:
1 <= word1.length, word2.length <= 105
word1
和 word2
仅包含小写英文字母原站题解
cpp 解法, 执行用时: 60 ms, 内存消耗: 20.7 MB, 提交时间: 2023-11-30 07:38:05
class Solution { public: bool closeStrings(string word1, string word2) { vector<int> count1(26), count2(26); for (char c : word1) { count1[c - 'a']++; } for (char c : word2) { count2[c - 'a']++; } for (int i = 0; i < 26; i++) { if (count1[i] > 0 && count2[i] == 0 || count1[i] == 0 && count2[i] > 0) { return false; } } sort(count1.begin(), count1.end()); sort(count2.begin(), count2.end()); return count1 == count2; } };
javascript 解法, 执行用时: 96 ms, 内存消耗: 47.3 MB, 提交时间: 2023-06-07 10:42:26
/** * @param {string} word1 * @param {string} word2 * @return {boolean} */ var closeStrings = function(word1, word2) { if(word1.length != word2.length)return false; let tab1 = new Array(26).fill(0); let tab2 = new Array(26).fill(0); for(let i = 0;i < word1.length;i ++){ tab1[word1.charCodeAt(i) - 97] ++; tab2[word2.charCodeAt(i) - 97] ++; } for(let i = 0;i < 26;i ++){ if(tab1[i] && tab2[i])continue; if(tab1[i] || tab2[i])return false; } tab1.sort((a,b)=>a - b); tab2.sort((a,b)=>a - b); for(let i = 0;i < 26;i ++){ if(tab1[i] != tab2[i])return false; } return true; };
java 解法, 执行用时: 15 ms, 内存消耗: 43.4 MB, 提交时间: 2023-06-07 10:41:55
class Solution { public boolean closeStrings(String word1, String word2) { // 不一样长,false if (word1.length() != word2.length()) { return false; } int type1 = 0, type2 = 0; int[] cnt1 = new int[26], cnt2 = new int[26]; char[] cs1 = word1.toCharArray(), cs2 = word2.toCharArray(); for (int i = 0; i < word1.length(); i++) { int c1 = cs1[i] - 'a'; int c2 = cs2[i] - 'a'; type1 |= 1 << c1; type2 |= 1 << c2; cnt1[c1]++; cnt2[c2]++; } // 类型不一样,false if (type1 != type2) { return false; } Arrays.sort(cnt1); Arrays.sort(cnt2); // 没有类似数量,false for (int i = 0; i < 26; i++) { if (cnt1[i] != cnt2[i]) { return false; } } return true; } }
golang 解法, 执行用时: 20 ms, 内存消耗: 6.7 MB, 提交时间: 2023-06-07 10:40:39
func closeStrings(word1 string, word2 string) bool { if len(word1)!=len(word2){ return false } f1,f2:=make([]int,26),make([]int,26) for i:=range word1{ f1[word1[i]-'a']++ f2[word2[i]-'a']++ } for i:=range f1{ if f1[i]==f2[i]||(f1[i]>0&&f2[i]>0){ continue }else{ return false } } sort.Ints(f1) sort.Ints(f2) for i:=range f1{ if f1[i]!=f2[i]{ return false } } return true }
python3 解法, 执行用时: 196 ms, 内存消耗: 16.7 MB, 提交时间: 2023-06-07 10:39:33
class Solution: def closeStrings(self, word1: str, word2: str) -> bool: from collections import Counter condition1 = len(word1) == len(word2) condition2 = set(word1) == set(word2) condition3 = sorted(list(Counter(word1).values())) == sorted(list(Counter(word2).values())) return condition1 and condition2 and condition3