题目:
给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。
交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。
- 例如,在 “abcd” 中交换下标 0 和下标 2 的元素可以生成 “cbad” 。
思路:
首先两字符串的长度得相等,若不等则返回 False,若相等则进行下一步的判断:
(1)若两字符串完全相同,则 s 中需存在两个处于不同位置的相同元素。若存在则返回 True,否则返回 False;
(2)若两字符串不完全相同,则看 s 和 goal 是否只有两个位置( 假定为i,j )的元素不同,且s[i]=goal[j],s[j]=goal[i]
解答:
class Solution:
def buddyStrings(self, s: str, goal: str) -> bool:
if len(s) != len(goal):
return False
#若两个字符串完全相同,s只能通过交换不同位置的相同字符得到goal
if s == goal:
#说明s中存在重复元素,这种方法还满巧妙的
if len(set(s)) < len(goal):
return True
else:
return False
#若两个字符串不同,当且仅当两个位置的元素不同,且可互换
diff = [(a, b) for a, b in zip(s, goal) if a != b]
return len(diff) == 2 and diff[0][0] == diff[1][1] and diff[0][1] == diff[1][0]