1. 问题描述:
有两个长度相同的字符串 s1 和 s2,且它们其中 只含有 字符 "x" 和 "y",你需要通过「交换字符」的方式使这两个字符串相同。
每次「交换字符」的时候,你都可以在两个字符串中各选一个字符进行交换。
交换只能发生在两个不同的字符串之间,绝对不能发生在同一个字符串内部。也就是说,我们可以交换 s1[i] 和 s2[j],但不能交换 s1[i] 和 s1[j]。
最后,请你返回使 s1 和 s2 相同的最小交换次数,如果没有方法能够使得这两个字符串相同,则返回 -1 。
示例 1:
输入:s1 = "xx", s2 = "yy" 输出:1 解释: 交换 s1[0] 和 s2[1],得到 s1 = "yx",s2 = "yx"。
示例 2:
输入:s1 = "xy", s2 = "yx" 输出:2 解释: 交换 s1[0] 和 s2[0],得到 s1 = "yy",s2 = "xx" 。 交换 s1[0] 和 s2[1],得到 s1 = "xy",s2 = "xy" 。 注意,你不能交换 s1[0] 和 s1[1] 使得 s1 变成 "yx",因为我们只能交换属于两个不同字符串的字符。
示例 3:
输入:s1 = "xx", s2 = "xy" 输出:-1
示例 4:
输入:s1 = "xxyyxyxyxx", s2 = "xyyxyxxxyx" 输出:4
提示:
1 <= s1.length, s2.length <= 1000s1, s2 只包含 'x' 或 'y'。2. 思路分析:
① 首先我们需要统计出s1与s2对应位置不同的字符并将其放置到列表中,这些相同位置字符不同都是需要交换才可以使得两个字符串相同的,统计完了之后需要判断出不同字符的列表的长度,假如为奇数肯定是不能够通过交换s1与s2的字符使其相同的直接返回-1即可
② 当不同字符的长度为偶数的时候这个时候肯定是可以通过交换两个字符串的位置使其相同的,具体的交换次数可以根据题目中给出的例子分析得到,下面以题目中的示例4进行分析,s1 = "xxyyxyxyxx", s2 = "xyyxyxxxyx",比较得到s1与s2不同的字符串分别为:
"xyxyyx"
"yxyxxy"
这些字母相同位置肯定是不一样的,所以我们可以交换1次使得两个字母相等,交换1次之后可以得到:
"yyxyyx"
"yxxxxy"
再交换1次那么4个字母都是一样的,接下来对于剩余的两个字符交换2次数即可完成,所以我们可以发现当x的字符的次数为奇数的时候那么交换的次数为不同字符串的长度需要最后两个字符得到的长度 / 2(一次可以使得两个字符相等) + 最后两个字符交换的2次即可,当为偶数的时候那么直接为x字符除以2的长度即可,我们可以使用python中的Collections.Counter方法将列表中的字符进行计数
3. 代码如下:
class Solution(object): def minimumSwap(self, s1, s2): diff = [s1[i] for i in range(len(s1)) if s1[i] != s2[i]] if len(diff) % 2 == 1: return -1 # 将列表转为字典的形式: 统计词频 dic = collections.Counter(diff) print(dic) return len(diff) // 2 if dic['x'] % 2 == 0 else (len(diff) - 2) // 2 + 2