859. 親密字符串
給你兩個字符串 s 和 goal ,只要我們可以通過交換 s 中的兩個字母得到與 goal 相等的結果,就返回?true?;否則返回 false 。
交換字母的定義是:取兩個下標 i 和 j (下標從 0 開始)且滿足 i != j ,接著交換 s[i] 和 s[j] 處的字符。
例如,在 “abcd” 中交換下標 0 和下標 2 的元素可以生成 “cbad” 。
示例 1:輸入:s = "ab", goal = "ba"
輸出:true
解釋:你可以交換 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此時 s 和 goal 相等。示例 2:輸入:s = "ab", goal = "ab"
輸出:false
解釋:你只能交換 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此時 s 和 goal 不相等。示例 3:輸入:s = "aa", goal = "aa"
輸出:true
解釋:你可以交換 s[0] = 'a' 和 s[1] = 'a' 生成 "aa",此時 s 和 goal 相等。示例 4:輸入:s = "aaaaaaabc", goal = "aaaaaaacb"
輸出:true
提示:
- 1 <= s.length, goal.length <= 2 * 10410^4104
- s 和 goal 由小寫英文字母組成
解題思路
分為三種情況進行討論
- 第一種就是滿足親密字符串定義的,字符串s和字符串goal之間恰好有兩個位置的字符是不相同的,而且我們恰好可以通過交換字符串s這兩個下標的元素使得二者相等
- 第二種情況就是字符串s和字符串goal只有一個位置上的字符是不相同的,因此我們不存在與其交換的下標,因此這種情況應該返回false
- 第三種情況就是兩個字符串是完全相等的,但是他們存在兩個不同下標的字符是相同的,因此我們可以通過交換這兩個下標,達到不改變原字符串,使兩字符串相等的目的。
代碼
class Solution {
public:bool buddyStrings(string s, string goal) {int n = s.size();int dif1 = -1;for (int i = 0; i < n; ++i) {if (s[i] != goal[i]) {if (dif1 == -1)dif1 = i;else {swap(goal[i], goal[dif1]);break;}}}if (dif1 == -1) {sort(s.begin(), s.end());for (int j = 1; j < n; ++j) {if (s[j] == s[j - 1])return true;}return false;} elsereturn s==goal;}
};