LeetCode每日一題: 親密字符串(No.859)

題目:親密字符串


給定兩個由小寫字母構成的字符串 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);
    }
}複製代碼
相關文章
相關標籤/搜索