859. 亲密字符串
给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。
交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。
例如,在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/buddy-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public boolean buddyStrings(String s, String goal) {
if(s.length() != goal.length())
return false;
int len = s.length();
int diff = 0;
int[] ctn1 = new int[26],ctn2 = new int[26];
for(int i = 0;i<len;i++){
int c1 = s.charAt(i) - 'a';
int c2 = goal.charAt(i) - 'a';
ctn1[c1]++;
ctn2[c2]++;
if(c1 != c2)
diff++;
}
boolean flag = false;
for(int i = 0;i<26;i++){
if(ctn1[i] != ctn2[i])
return false;
if(ctn1[i]>1)
flag = true;
}
return diff == 2 || diff==0 && flag;
}
}
在什么情况下两个字符串为亲密字符串?
- 当 s 与 goal 长度或词频不同,必然不为亲密字符;
- 当s 与 goal 不同字符为2个时,并且这两个字符交换后s=goal时,或者s=goal,并且s(也就是goal)中有出现频次超过两次的字符时。
这道题目就是先搞清楚什么情况下两个字符串为亲密字符串,然后用代码将情况描述出来即可。是一种相对简单的模拟题(简单我也不会)。