[LeetCode] 859. Buddy Strings 夥計字符串



Given two strings A and B of lowercase letters, return true if and only if we can swap two letters in A so that the result equals B.html

Example 1:git

Input: A = "ab", B = "ba"
Output: true

Example 2:github

Input: A = "ab", B = "ab"
Output: false

Example 3:數組

Input: A = "aa", B = "aa"
Output: true

Example 4:code

Input: A = "aaaaaaabc", B = "aaaaaaacb"
Output: true

Example 5:htm

Input: A = "", B = "aa"
Output: false

Note:blog

  1. 0 <= A.length <= 20000
  2. 0 <= B.length <= 20000
  3. A and B consist only of lowercase letters.



這道題給了兩個字符串A和B,說是咱們必須調換A中的兩個字符的位置一次,問是否能獲得字符串B。這道題給的例子又多又全,基本上把全部的 corner cases 都覆蓋了,好比咱們對比例子2和例子3,能夠發現雖然兩個例子中A和B字符串都相等,可是仔細觀察的話,能夠發現 "ab" 中沒有相同的字符,而 "aa" 中有相同的字符,那麼實際上 "aa" 是能夠調換兩個字符的位置的,這樣還跟字符串B相等,是符合題意的,由於題目要求必需要調換一次位置,若沒有相同的字符,是沒法調換位置後和B相等的。leetcode

那麼咱們應該能夠總結出一些規律了,首先字符串A和B長度必需要相等,不相等的話直接返回 false。假如起始時A和B就徹底相等,那麼只有當A中有重複字符出現的時候,才能返回 true。快速檢測重複字符的方法就是利用 HashSet 的自動去重複功能,將A中全部字符存入 HashSet 中,如有重複字符,那麼最終 HashSet 的大小必定會小於原字符串A的長度。對於A和B長度相等,可是字符串自己不相等的通常狀況,咱們能夠記錄出全部對應字符不相同的位置,放到一個數組 diff 中,最終判斷 diff 數組的長度是否爲2,且判斷交換位置後是否跟B中對應的位置上的字符相同便可,參見代碼以下:字符串


class Solution {
public:
    bool buddyStrings(string A, string B) {
        if (A.size() != B.size()) return false;
        if (A == B && unordered_set<char>(A.begin(), A.end()).size() < A.size()) return true;
        vector<int> diff;
        for (int i = 0; i < A.size(); ++i) {
            if (A[i] != B[i]) diff.push_back(i);
        }
        return diff.size() == 2 && A[diff[0]] == B[diff[1]] && A[diff[1]] == B[diff[0]];
    }
};



Github 同步地址:get

https://github.com/grandyang/leetcode/issues/859



參考資料:

https://leetcode.com/problems/buddy-strings/

https://leetcode.com/problems/buddy-strings/discuss/141780/Easy-Understood



LeetCode All in One 題目講解彙總(持續更新中...)

相關文章
相關標籤/搜索