思路其核心在于通过比较两个字符串中字符的相同与不同来判断它们是否可以通过一次交换变得相等。以下是更详细的思路解释:
思路步骤:
-
长度比较:
- 首先检查两个字符串的长度。如果长度不相等,它们不可能通过交换字符变得相等,因此立即返回
False
。
- 首先检查两个字符串的长度。如果长度不相等,它们不可能通过交换字符变得相等,因此立即返回
-
查找不同的字符:
- 初始化一个列表来存储不同字符的索引。
- 使用循环逐个比较两个字符串的字符。当发现某个位置的字符不同,就将该位置的索引记录在列表中。
-
分析不同字符的情况:
- 两种情况:
- 没有不同的字符:如果不同字符的索引列表为空,说明两个字符串完全相同,直接返回
True
。 - 有两个不同的字符:如果有两个不同的字符,那么我们检查这两个字符是否可以互换。
- 即:这两个字符在
s1
中互换后是否等于在s2
中的对应字符。 - 如果可以互换,返回
True
。
- 即:这两个字符在
- 没有不同的字符:如果不同字符的索引列表为空,说明两个字符串完全相同,直接返回
- 两种情况:
-
其他情况:
- 如果不同字符的数量不是 0 或 2,那就直接返回
False
,因为这意味着它们不能通过一次交换变得相等。
- 如果不同字符的数量不是 0 或 2,那就直接返回
思路总结:
这个函数通过简单而有效的比较来判断字符串是否可通过交换相等。它只需一次遍历来收集不同字符的索引,因此其时间复杂度为 O(n),在效率上是非常高的。这种思路确保了代码能够快速判断两个字符串之间的关系,并在字符不一致的情况下及时返回结果。
def can_transform(s1, s2):
# 检查两个字符串的长度是否相等
if len(s1) != len(s2):
return False
# 用来记录不同字符的索引
diff_indices = []
# 找出两个字符串中不同的字符
for i in range(len(s1)):
if s1[i] != s2[i]:
diff_indices.append(i)
# 根据不同字符的个数判断是否可以通过一次交换来相等
if len(diff_indices) == 2:
# 检查这两个不同字符是否可以互换
i, j = diff_indices
return s1[i] == s2[j] and s1[j] == s2[i]
elif len(diff_indices) == 0:
# 如果没有不同字符,两个字符串已经相等
return True
# 如果不同字符的数量不是2或者0,返回 False
return False
# 示例测试
s1 = "bank"
s2 = "kanb"
print(can_transform(s1, s2)) # 输出: True
s1 = "attack"
s2 = "defend"
print(can_transform(s1, s2)) # 输出: False
s1 = "kelb"
s2 = "kelb"
print(can_transform(s1, s2)) # 输出: True
s1 = "abcd"
s2 = "dcba"
print(can_transform(s1, s2)) # 输出: False