859. 亲密字符串
题目描述:
给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true ;否则返回 false 。
示例 1:
输入: A = “ab”, B = “ba”
输出: true
示例 2:
输入: A = “ab”, B = “ab”
输出: false
示例 3:
输入: A = “aa”, B = “aa”
输出: true
示例 4:
输入: A = “aaaaaaabc”, B = “aaaaaaacb”
输出: true
示例 5:
输入: A = “”, B = “aa”
输出: false
提示:
- 0 <= A.length <= 20000
- 0 <= B.length <= 20000
- A 和 B 仅由小写字母构成。
题目难度:
easy
题目分析:
本题为字符串问题。要求两字符串中交换两个位置能否与另一字符串相等。
本题思路::
①、两字符串相等时,字符串里的字符是否有存在重复的,如果有重复则能够通过交换位置与另一字符串相等,如果不重复,则之间返回false。
②两个字符串相等时,不妨设位置i和j不相等(若超过两个位置不等,之间返回false),若能够换位成功则有,charA[i] = charB[j],charA[j] = charB[i]。
代码实现:
public static boolean buddyStrings(String A, String B) {
if (A.length() != B.length())
return false;
char[] charsA = A.toCharArray();
char[] charsB = B.toCharArray();
if (A.equals(B)){ //如果字符串内容相等
int [] count = new int[26];
for ( char chars : charsA){
count[chars - 'a'] ++; //记录下该位置的各数
}
for (int c : count) {
if (c > 1) {
return true; //如果存在个数大于1,则返回true
}
}
return false;
}else {
int first = 0; //第一个不相等的位置
int second = 0; //第二个不相等的位置
for (int i = 0; i < charsA.length; i++){
if (charsA[i] != charsB[i]){
if (first == 0){
first = i;
}else if (second == 0){
second = i;
}else {
return false; //不相等的位置超过两个
}
}
}
if (charsA[first] != charsB[second] || charsA[second] != charsB[first])
return false;
}
return true;
}