親密字符串-算法刷題筆記

算法題目

859親密字符串:

給定兩個由小寫字母構成的字符串 A 和 B ,只要咱們能夠經過交換 A 中的兩個字母獲得與 B
相等的結果,就返回 true ;不然返回 false 。java

示例 1:算法

輸入: A = "ab", B = "ba"
輸出: true

示例 2:數組

輸入: A = "ab", B = "ab"
輸出: false

示例 3:post

輸入: A = "aa", B = "aa"
輸出: true

示例 4:code

輸入: A = "aaaaaaabc", B = "aaaaaaacb"
輸出: true

示例 5:字符串

輸入: A = "", B = "aa"
輸出: false

提示:
0 <= A.length <= 20000
0 <= B.length <= 20000
A 和 B 僅由小寫字母構成。class

/*
解法一:
    思路:
        1,當字符串長度不相等,數組長度小於2,的狀況下會返回false
        2,當字符串長度大於2,且徹底相同時,若是字符串存在重複字符,會返回true
        3.當字符串不相同的字符非2時,返回false
        4,當字符串不相同字符對爲2時,且交叉相同時,返回ture

解法二:
    思路:只考慮知足狀況的兩種狀況
        1,字符串徹底相同,而且字符串存在重複字符
        2,字符串只存在不一樣的兩個字符,並且倆字符交叉相同

 */
import java.util.HashSet;

/**

@author cosefy

@date 2020/7/1
*/
public class BuddyStrings {
public static void main(String[] args) {
    String A = "abab";
    String B = "abbb";
    boolean rs1 = test1(A, B);
    System.out.println(rs1);
    boolean rs2 = test2(A, B);
    System.out.println(rs2);
}
//解法一
private static boolean test1(String A, String B) {
    int lenA = A.length();
    int lenB = B.length();

​    //若是倆字符串長度不一樣,或者字符串長度小於2
​    if (lenA != lenB || lenA < 2 || lenB < 2)
​        return false;

​    //若是倆字符串相同,而且存在重複字符,返回true
​    if (A.equals(B)) {
​        HashSet<Character> set = new HashSet<>();
​        for (int i = 0; i < lenA; i++) {
​            if (set.contains(A.charAt(i)))
​                return true;
​            else
​                set.add(A.charAt(i));
​        }
​        return false;
​    }

​    //若是倆字符串不一樣,進行判斷
​    int count = 0;    //計數不一樣的字符個數
​    int pre = -1, post = -1;  //pre,post分別記錄倆不一樣字符的位置
​    for (int i = 0; i < lenA; i++) {
​        if (count > 2) {
​            return false;
​        }
​        if (A.charAt(i) == B.charAt(i))
​            continue;
​        else {
​            ++count;
​            if (pre == -1)
​                pre = i;
​            else
​                post = i;
​        }

​    }
​    return count == 2 && A.charAt(pre) == B.charAt(post) && A.charAt(post) == B.charAt(pre);
}
//解法二
    public static boolean test2(String A, String B) {
        if (A.length()!=B.length())
            return false;
        int count = 0;//用來統計倆字符串不相同字符的個數
        int sum = 0;//用來檢查倆字符串不一樣字符串差值之和是否相同

​        HashSet<Character> set = new HashSet<>();
​        for (int i = 0; i < A.length(); i++) {
​            set.add(A.charAt(i));
​            if (A.charAt(i) == B.charAt(i))
​                continue;
​            else {
​                count++;
​                sum += A.charAt(i) - B.charAt(i);
​            }
​        }
​        return (sum == 0 && count == 2) || (count == 0 && A.length() > set.size());
​    }
}
相關文章
相關標籤/搜索