1657. 确定两个字符串是否接近 --力扣 --JAVA

简介: 如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :操作 1:交换任意两个 现有 字符。例如,abcde -> aecdb操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a )你可以根据需要对任意一个字符串多次使用这两种操作。给你两个字符串,word1 和 word2 。如果 word1 和 word2 接近 ,就返回 true ;否则,返回 false 。

 题目

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

    • 操作 1:交换任意两个 现有 字符。
      • 例如,abcde -> aecdb
        • 操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。
          • 例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a

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

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

            解题思路

              1. 两种操作可以无限次使用,所以需要对操作1和操作二进行进一步的扩充;
                1. 操作一:每个字符出现的次数相等即为接近;
                2. 操作二:字符出现的次数可以一一对应(字符本身不需要一一对应);
                  1. 排除特殊情况即:字符串长度不相等;
                  2. 逐个进行每个操作判断是否接近,统计各字符出现次数;
                  3. 判断字符串之间是否存在未出现的字符;
                  4. 比对字符的次数(与字符本身无关,建议先排序)。

                  代码展示

                  class Solution {
                      public boolean closeStrings(String word1, String word2) {
                          int m = word1.length();
                          int n = word2.length();
                          if(m != n){
                              return false;
                          }
                          Map<Character,Integer> data1 = new HashMap<>();
                          Map<Character,Integer> data2 = new HashMap<>();
                          //统计每个字符出现的次数
                          for (int i = 0; i < m; i++){
                              char ch1 = word1.charAt(i);
                              char ch2 = word2.charAt(i);
                              data1.put(ch1, data1.getOrDefault(ch1, 0) + 1);
                              data2.put(ch2, data2.getOrDefault(ch2, 0) + 1);
                          }
                          List<Integer> list1 = new ArrayList<>();
                          List<Integer> list2 = new ArrayList<>();
                          for (Character ch : data1.keySet()){
                              Integer ch1 = data1.get(ch);
                              Integer ch2 = data2.get(ch);
                              //判断word2中是否不存在该字符,若不存在则返回false
                              if(ch2 == null){
                                  return false;
                              } else if (!ch1.equals(ch2)){
                                  list1.add(ch1);
                                  list2.add(ch2);
                              }
                          }
                          if(!list1.isEmpty()) {
                              list1.sort(null);
                              list2.sort(null);
                              for (int i = 0; i < list1.size(); i++) {
                                  //包装类对象不能当作int直接划等号,否则会比对失败
                                  if (!Objects.equals(list1.get(i), list2.get(i))) {
                                      return false;
                                  }
                              }
                          }
                          return true;
                      }
                  }

                  image.gif


                  目录
                  相关文章
                  |
                  22天前
                  |
                  存储 安全 Java
                  Java零基础-字符串详解
                  【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
                  96 60
                  |
                  11天前
                  |
                  缓存 算法 Java
                  本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
                  在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
                  33 6
                  |
                  1月前
                  |
                  Java 数据库
                  案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
                  这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
                  46 15
                  |
                  27天前
                  |
                  JavaScript
                  力扣3333.找到初始输入字符串Ⅱ
                  【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
                  32 1
                  |
                  1月前
                  |
                  C++
                  Leetcode第43题(字符串相乘)
                  本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
                  24 9
                  |
                  1月前
                  |
                  Java
                  JAVA易错点详解(数据类型转换、字符串与运算符)
                  JAVA易错点详解(数据类型转换、字符串与运算符)
                  50 4
                  |
                  1月前
                  |
                  算法 C++
                  Leetcode第八题(字符串转换整数(atoi))
                  这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
                  17 0
                  |
                  1月前
                  【LeetCode 22】459.重复的子字符串
                  【LeetCode 22】459.重复的子字符串
                  28 0
                  |
                  1月前
                  【LeetCode 20】151.反转字符串里的单词
                  【LeetCode 20】151.反转字符串里的单词
                  19 0
                  |
                  1月前
                  【LeetCode 19】541.反转字符串II
                  【LeetCode 19】541.反转字符串II
                  20 0