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

173 阅读3分钟

确定两个字符串是否接近

1.题目链接

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

2.原题描述:

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

操作 1:交换任意两个 现有 字符。 例如,abcde -> aecdb 操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。 例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a ) 你可以根据需要对任意一个字符串多次使用这两种操作。

给你两个字符串,word1 word2 。如果 word1 word2 接近 ,就返回 true ;否则,返回 false 。

3.相关算法

排序:

如果两个字符串接近,那么它们的字符种类和字符出现次数都应该相同。因此,可以将两个字符串排序后比较是否相等。

哈希表:

可以使用哈希表统计每个字符串中字符出现的次数,然后比较两个哈希表是否相同。需要注意的是,两个字符串的字符种类必须相同,因此可以先统计两个字符串的字符种类,如果不同则直接返回false。

4.本题主要思路

本题使用排序来解题,创建两个大小为26的整形数组,将 a-z 26个英文字符对应数组的0-25下标,通过循环累加对应下标计数保存到数组中,记录完,通过判断相同下标中的数是否都存在或者都不存在,若不满足则返回false,最后将数组进行排序,排序完进行比较,当排序完后两数组相等则说明两个字符串接近,排序的原因是因为题目的第二种操作,可以将两个字符进行相互替换,只需要保证数量上的相等即可。

5.源码分析

class Solution {
    public boolean closeStrings(String word1, String word2) {
        if (word1.length() != word2.length()) { 			// 1
            return false;
        }
        
        int[] count1 = new int[26];					// 2
        int[] count2 = new int[26];
        for (char c : word1.toCharArray()) {				// 3
            count1[c - 'a']++;
        }
        for (char c : word2.toCharArray()) {
            count2[c - 'a']++;
        }
        
        for (int i = 0; i < 26; i++) {
            if ((count1[i] == 0) != (count2[i] == 0)) {		        // 4
                return false;
            }
        }
        
        Arrays.sort(count1);					        // 5
        Arrays.sort(count2);
        
        return Arrays.equals(count1, count2);				// 6
    }
}
  1. 首先判断两个字符串的数量是否相等,若不相等则不可能接近,直接返回false;
  2. 创建两个整形数组,用下标对应英文字母进行数量的统计;
  3. for循环遍历字符串,统计各个字符的数量;
  4. 判断每个字符是否对应存在,当word1中该字符存在word2中该字符不存在则返回false(判断该字符串是否满足操作1的要求);
  5. 将字符串的数量进行排序,方便满足操作2的条件;
  6. 排序完后两个数组相等,返回结果true,否则返回false。