LeetCode 859. Buddy Strings
原题链接在这里:https://leetcode.com/problems/buddy-strings/
题目:
Given two strings s
and goal
, return true
if you can swap two letters in s
so the result is equal to goal
, otherwise, return false
.
Swapping letters is defined as taking two indices i
and j
(0-indexed) such that i != j
and swapping the characters at s[i]
and s[j]
.
- For example, swapping at indices
0
and2
in"abcd"
results in"cbad"
.
Example 1:
Input: s = "ab", goal = "ba" Output: true Explanation: You can swap s[0] = 'a' and s[1] = 'b' to get "ba", which is equal to goal.
Example 2:
Input: s = "ab", goal = "ab" Output: false Explanation: The only letters you can swap are s[0] = 'a' and s[1] = 'b', which results in "ba" != goal.
Example 3:
Input: s = "aa", goal = "aa" Output: true Explanation: You can swap s[0] = 'a' and s[1] = 'a' to get "aa", which is equal to goal.
Constraints:
1 <= s.length, goal.length <= 2 * 104
s
andgoal
consist of lowercase letters.
题解:
If length is different, then it can't bu buddy strings, return false.
If s and goal are equal, then at least there should be duplciate chars to be swapped.
Otherwise, there could be only two difference and corresponding place could be swapped.
Time Complexity: O(m). m = s.length().
Space: O(m).
AC Java:
1 class Solution { 2 public boolean buddyStrings(String s, String goal) { 3 int m = s.length(); 4 int n = goal.length(); 5 if(m != n){ 6 return false; 7 } 8 9 if(s.equals(goal)){ 10 HashSet<Character> hs = new HashSet<>(); 11 for(char c : s.toCharArray()){ 12 hs.add(c); 13 } 14 15 return hs.size() != m; 16 } 17 18 List<Integer> diff = new ArrayList<>(); 19 for(int i = 0; i < m; i++){ 20 if(s.charAt(i) != goal.charAt(i)){ 21 diff.add(i); 22 } 23 } 24 25 return diff.size() == 2 && s.charAt(diff.get(0)) == goal.charAt(diff.get(1)) && s.charAt(diff.get(1)) == goal.charAt(diff.get(0)); 26 } 27 }