列表

详情


1657. 确定两个字符串是否接近

如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近

你可以根据需要对任意一个字符串多次使用这两种操作。

给你两个字符串,word1word2 。如果 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 ,反之亦然。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: bool closeStrings(string word1, string 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

上一题