題目:親密字符串
給定兩個由小寫字母構成的字符串 A 和 B 。
只要咱們能夠經過交換 A 中的兩個字母獲得與 B 相等的結果,就返回 true ;不然返回 false 。
複製代碼
示例:
輸入: A = "ab", B = "ba"
輸出: true
輸入: A = "ab", B = "ab"
輸出: false
輸入: A = "aa", B = "aa"
輸出: true
輸入: A = "aaaaaaabc", B = "aaaaaaacb"
輸出: true
輸入: A = "", B = "aa"
輸出: false
複製代碼
思考:
這道題首先判斷兩個字符串長度是否相等,長度不相等不多是親密字符串。
長度相等時,再比較兩個字符串是否相等。
兩個字符串相等:則查找在A或者B中是否有相同字符出現,有則是親密字符串,沒有就不是親密字符串。
兩個字符串不相等:先遍歷記錄不相等的字符個數和位置。不相等的字符數不等於2就不是親密字符串。
不相等的字符數等於2:A交換這兩個字符,再與B比較,相等就是親密字符串。
複製代碼
實現:
class Solution {
public boolean buddyStrings(String A, String B) {
//比較長度
if (A.length() != B.length()) {
return false;
}
//字符串是否相等
if (A.equals(B)) {
//相等判斷是否有重複字符
for (int count = 0; count < A.length(); count++) {
if (A.indexOf(A.charAt(count), count + 1) != -1) {
//有重複字符返回true
return true;
}
}
//沒有返回false
return false;
} else {//字符串不相等
//記錄不相等字符出現次數
int time = 0;
//記錄不相等字符位置
List<Integer> pos = new ArrayList<>();
for (int count = 0; count < A.length(); count++) {
if (A.charAt(count) != B.charAt(count)) {
time++;
pos.add(count);
}
}
//次數不等於2 不是親密字符串
if (time !=2) {
return false;
} else {
//等於2交換字符後再次比較
return swap(A, pos.get(0), pos.get(1)).equals(B);
}
}
}
private String swap(String str, Integer pos1, Integer pos2) {
char[] charArray = str.toCharArray();
char temp = charArray[pos1];
charArray[pos1] = charArray[pos2];
charArray[pos2] = temp;
return new String(charArray);
}
}複製代碼