四川瑞通工程建设有限公司网站,网站建设的论坛,店面设计分析,html网页制作菜鸟教程题目 如果可以使用以下操作从一个字符串得到另一个字符串#xff0c;则认为两个字符串 接近 #xff1a; 操作 1#xff1a;交换任意两个 现有 字符。 例如#xff0c;abcde - aecdb操作 2#xff1a;将一个 现有 字符的每次出现转换为另一个 现有 字符#xff0c;并…题目 如果可以使用以下操作从一个字符串得到另一个字符串则认为两个字符串 接近 操作 1交换任意两个 现有 字符。 例如abcde - aecdb操作 2将一个 现有 字符的每次出现转换为另一个 现有 字符并对另一个字符执行相同的操作。 例如aacabb - bbcbaa所有 a 转化为 b 而所有的 b 转换为 a 你可以根据需要对任意一个字符串多次使用这两种操作。 给你两个字符串word1 和 word2 。如果 word1 和 word2 接近 就返回 true 否则返回 false 。 解题思路
两种操作可以无限次使用所以需要对操作1和操作二进行进一步的扩充 操作一每个字符出现的次数相等即为接近操作二字符出现的次数可以一一对应(字符本身不需要一一对应);排除特殊情况即字符串长度不相等逐个进行每个操作判断是否接近统计各字符出现次数判断字符串之间是否存在未出现的字符比对字符的次数(与字符本身无关建议先排序)。
代码展示
class Solution {public boolean closeStrings(String word1, String word2) {int m word1.length();int n word2.length();if(m ! n){return false;}MapCharacter,Integer data1 new HashMap();MapCharacter,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);}ListInteger list1 new ArrayList();ListInteger list2 new ArrayList();for (Character ch : data1.keySet()){Integer ch1 data1.get(ch);Integer ch2 data2.get(ch);//判断word2中是否不存在该字符若不存在则返回falseif(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;}
}