Problem
Given two strings A
and B
of lowercase letters, return true
if you can swap two letters in A
so the result is equal to B
, 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 A[i]
and A[j]
. For example, swapping at indices 0
and 2
in "abcd"
results in "cbad"
.
Example 1:
1 | Input: A = "ab", B = "ba" |
Example 2:
1 | Input: A = "ab", B = "ab" |
Example 3:
1 | Input: A = "aa", B = "aa" |
Example 4:
1 | Input: A = "aaaaaaabc", B = "aaaaaaacb" |
Example 5:
1 | Input: A = "", B = "aa" |
Analysis
连续两天都是字符串类型的题目,这道题目要求在一个字符串上做一次交换操作(必须做一次),变换后能否与另一个字符串相同。因为要交换两个位置上的字符,所以我们首先要找到这两个位置。
先考虑最常见的情况,就是两个位置的值不一样,这样通过逐个比对A
和B
两个字符串,就能找到字符不相同的位置,如果不同的位置只有一个或者超过了两个,则说明没有办法通过一次交换使得两个字符串相同,这两种情况直接return false。然后考虑刚好有两个位置不同的情况,这种情况直接看看交换的字符是不是相同的就可以了,如果是相同则return true,否则return false。
上面的几种情况判断都不难,比较坑的是一些edge case,当两个字符串完全相同的时候,也不一定代表变换后就能相同。比如aaab
和aaab
,因为有重复的a
,所以重复的a
相互交换并不会影响结果,一次交换后两个字符串仍然是相同的;但是abc
和abc
这种就不可以,因为必须要交换一次,交换后两个字符串就不能相等了。所以在判断的时候还要判断字符串中是否有重复的元素。
Solution
判断是否有重复的元素的时候用到了map,其余的并没有使用其他数据结构了。
Code
1 | class Solution { |
Summary
这道题在coding层面并不难,但是要考虑多种case才能完全pass。这道题米也是告诉我们在刷题的时候不能过度依赖题目给出的test case,自己在写题的时候也应该思考怎么写test case,这样才能更好地提高代码质量。这道题目的分享到这里,谢谢!