859. 亲密字符串

172 阅读2分钟

「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」。

题目

给你两个字符串 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 相等。

示例2

输入:s = "ab", goal = "ab"
输出:false
解释:你只能交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 不相等。

思路分析

首先判断两个字符串的长度是否相等,如果不等直接过滤。

其次维护两个指针,不断遍历字符串的元素,当第一次判断两个指针元素不等时,记录两个元素,当第二次判断两个指针元素不等时,比较两个元素,是否是之前记录的两个元素(相等于一个ab ba的场景),如果是则继续遍历,如果不是则返回false。当第三次判断两个指针元素不等时,直接返回false。

当结束一次遍历时,有几种可能,

  • 第一种是不存在不等元素,这个时候需要判断是否有重复元素。如果有重复元素,返回true,否则返回false(即ab , ab)
  • 第二种是存在一个不等元素,这个时候返回false
  • 第三种是存在两个不等元素,且第二次不等元素是之前记录的两个元素,这个时侯返回true

本方法最慢要经历两次for循环(需要判断是否有重复元素),因此时间复杂度是O(n)