Table of Contents
中文版:
给你两个长度相等的字符串 s 和 t。每一个步骤中,你可以选择将 t 中的 任一字符 替换为 另一个字符。
返回使 t 成为 s 的字母异位词的最小步骤数。
字母异位词 指字母相同,但排列不同的字符串。
示例 1:
输出:s = "bab", t = "aba"
输出:1
提示:用 'b' 替换 t 中的第一个 'a',t = "bba" 是 s 的一个字母异位词。
示例 2:
输出:s = "leetcode", t = "practice"
输出:5
提示:用合适的字符替换 t 中的 'p', 'r', 'a', 'i' 和 'c',使 t 变成 s 的字母异位词。
示例 3:
输出:s = "anagram", t = "mangaar"
输出:0
提示:"anagram" 和 "mangaar" 本身就是一组字母异位词。
示例 4:
输出:s = "xxyyzz", t = "xxyyzz"
输出:0
示例 5:
输出:s = "friend", t = "family"
输出:4
提示:
1 <= s.length <= 50000
s.length == t.length
s 和 t 只包含小写英文字母
英文版:
Given two equal-size strings s and t. In one step you can choose any character of t and replace it with another character.
Return the minimum number of steps to make t an anagram of s.
An Anagram of a string is a string that contains the same characters with a different (or the same) ordering.
Example 1:
Input: s = "bab", t = "aba"
Output: 1
Explanation: Replace the first 'a' in t with b, t = "bba" which is anagram of s.
Example 2:
Input: s = "leetcode", t = "practice"
Output: 5
Explanation: Replace 'p', 'r', 'a', 'i' and 'c' from t with proper characters to make t anagram of s.
Example 3:
Input: s = "anagram", t = "mangaar"
Output: 0
Explanation: "anagram" and "mangaar" are anagrams.
Example 4:
Input: s = "xxyyzz", t = "xxyyzz"
Output: 0
Example 5:
Input: s = "friend", t = "family"
Output: 4
Constraints:
1 <= s.length <= 50000
s.length == t.length
s and t contain lower-case English letters only.
My answer:
class Solution:
def minSteps(self, s: str, t: str) -> int:
s_dict = {}
t_dict = {}
for i in range(len(s)):
if s[i] not in s_dict.keys():
s_dict[s[i]] = 1
else:
s_dict[s[i]] += 1
for i in range(len(t)):
if t[i] not in t_dict.keys():
t_dict[t[i]] = 1
else:
t_dict[t[i]] += 1
# print(s_dict)
# print(t_dict)
res = 0
for key in s_dict.keys():
# print(key)
if (key in t_dict.keys()) :
if (s_dict[key] - t_dict[key] > 0):
num = s_dict[key] - t_dict[key]
# print(num)
res += num
else:
res += s_dict[key]
return res
代码中的 print 都是为了调 bug。万能 print 大法,就能直接看到哪里和自己预想的不一样。
解题报告:
算法:将 s , t 的内容存在两个 dict 中,其中 key 是 字符串中出现的字符,value 是该字符出现的个数。之后两个 dict 比较,遍历 s_dict 中的每个可以,如果 t_dict 存在该 key,且 s 中个数 > t,则证明需要改变 s-t 个,所以结果中加上 s-t 。注意不用考虑 s< t的情况,因为s 和 t 长度相同,如果 s和t 中字母也相同,则 s > t 时把 t 少的字母变成 s 中的字母即可,比如 bab 和 aba,只要将 t 中的 a 变为 b 即可。注意找好基准,本代码以 s 为基准。 例子 2 中 leetcode 比 practice 多 2 个 e,和 l c d。
解答本题的时候犯了个错误,在 for 循环里面的两个 if 处,一开始的写法是
if (key in t_dict.keys()) and if (s_dict[key] - t_dict[key] > 0):
然后下面的 else的意思就是 不满足 and 前的条件,或不满足 and 后的条件,而我想要的是不满足and 前的条件就进入 else。导致错误。