题目介绍:
给你两个字符串 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 相等。
思路分析:
看好这道题目要求,只能改变其中两个字母的位置,且必须改变一次!!
所以不能直接哈希表。
- 如果s串和goal串字符相等,则看s串中有没有重复的字符,如果有则直接交换重复的字符就可以了,返回True。如果s串中没有重复字符,但又必须交换一次位置,s串和goal串本来相等,交换一次之后必然不相等,直接返回False
- 将两个字符串变为列表并且分别排序
- 排序过后如果两个字符串不相等则直接返回False,想象一下,如果s串可以通过交换两个字母之后和goal串相等,则它们排序之后的串一定相等。
- 排序之后对位比较两个串,如果有且仅有两个位置不一样,则说明可以通过交换S串的这两个位置达到和goal串相等的目的,此时直接返回True。
完整代码:
class Solution:
def buddyStrings(self, s: str, goal: str) -> bool:
if s == goal:
if len(set(s)) != len(s):
return True
return False
temp = list(s)
temp.sort()
temp_goal = list(goal)
temp_goal.sort()
res = 0
if temp != temp_goal:
return False
for i in range(len(s)):
if s[i] != goal[i]:
res += 1
if res == 2:
return True
return False