給定兩個由小寫字母構成的字符串 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()); } }