题目描述
如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :
- 操作 1:交换任意两个 现有 字符。例如,abcde -> aecdb
- 操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a )
你可以根据需要对任意一个字符串多次使用这两种操作。给你两个字符串,word1 和 word2 。如果 word1 和 word2 接近 ,就返回 true ;否则,返回 false 。
解析
题目说的很复杂,实际上只需要满足三个条件就能达到题目要求:
- 1.两个字符串的长度一致
- 2.两个字符串中的字符集一样
- 3.字符出现的次数集合一样
首先1和2是基本条件,两种操作不可能改变长度和变出新的字符,而满足3的话可以通过两个操作达成目标。
public boolean closeStrings(String word1, String word2) {
if(word1.length() != word2.length()){
return false;
}
int[] times1 = new int[123];
int[] times2 = new int[123];
char[] w1 = word1.toCharArray();
char[] w2 = word2.toCharArray();
for(int i = 0; i < word1.length(); i++){
times1[w1[i]] ++;
times2[w2[i]] ++;
}
// 判断元素是否相等
for(int i = 97; i < 123; i++){
if((times1[i] != 0 && times2[i] == 0) || (times1[i] == 0 && times2[i] != 0)){
return false;
}
}
Arrays.sort(times1);
Arrays.sort(times2);
return Arrays.equals(times1, times2);
}
将字符串转为字符数组后会快一点。另外如果知道出现频率的最大值,使用频率数组会更快(提交最前面的就是),但是这种方式针对题目的输入可以,但是并不是特别通用,次数太多的话额外的空间开销会非常大。