题目
标题和出处
标题:制造字母异位词的最小步骤数
难度
4 级
题目描述
要求
给你两个长度相等的字符串 s \texttt{s} s 和 t \texttt{t} t。每一个步骤中,你可以选择将 t \texttt{t} t 中的任一字符替换为另一个字符。
返回使 t \texttt{t} t 成为 s \texttt{s} s 的字母异位词的最小步骤数。
字母异位词指字母相同,但排列不同(也可能相同)的字符串。
示例
示例 1:
输入:
s
=
"bab",
t
=
"aba"
\texttt{s = "bab", t = "aba"}
s = "bab", t = "aba"
输出:
1
\texttt{1}
1
解释:用
‘b’
\texttt{`b'}
‘b’ 替换
t
\texttt{t}
t 中的第一个
‘a’
\texttt{`a'}
‘a’,
t
=
"bba"
\texttt{t = "bba"}
t = "bba" 是
s
\texttt{s}
s 的一个字母异位词。
示例 2:
输入:
s
=
"leetcode",
t
=
"practice"
\texttt{s = "leetcode", t = "practice"}
s = "leetcode", t = "practice"
输出:
5
\texttt{5}
5
解释:用合适的字符替换
t
\texttt{t}
t 中的
‘p’
\texttt{`p'}
‘p’、
‘r’
\texttt{`r'}
‘r’、
‘a’
\texttt{`a'}
‘a’、
‘i’
\texttt{`i'}
‘i’ 和
‘c’
\texttt{`c'}
‘c’,使
t
\texttt{t}
t 变成
s
\texttt{s}
s 的字母异位词。
示例 3:
输入:
s
=
"anagram",
t
=
"mangaar"
\texttt{s = "anagram", t = "mangaar"}
s = "anagram", t = "mangaar"
输出:
0
\texttt{0}
0
解释:
"anagram"
\texttt{"anagram"}
"anagram" 和
"mangaar"
\texttt{"mangaar"}
"mangaar" 本身就是一组字母异位词。
数据范围
- 1 ≤ s.length ≤ 5 × 10 4 \texttt{1} \le \texttt{s.length} \le \texttt{5} \times \texttt{10}^\texttt{4} 1≤s.length≤5×104
- s.length = t.length \texttt{s.length} = \texttt{t.length} s.length=t.length
- s \texttt{s} s 和 t \texttt{t} t 只包含小写英语字母
解法
思路和算法
两个字符串是字母异位词等价于两个字符串中每个字符的出现次数相同。为了将字符串 t t t 变成字符串 s s s 的字母异位词,需要得到只在字符串 t t t 中出现的字符,将这些字符替换使得字符串 t t t 变成字符串 s s s 的字母异位词。
为了得到只在字符串 t t t 中出现的字符,需要统计两个字符串中每个字符的出现次数,比较每个字母在两个字符串中的出现次数,计算需要替换的最少字符数。如果一个字符在字符串 s s s 中的出现次数小于在字符串 t t t 中的出现次数,则字符串 t t t 中存在多余的该字符,需要将这些多余字符替换。
由于只需要关心哪些字符在字符串 s s s 中的出现次数小于在字符串 t t t 中的出现次数,以及这些字符在两个字符串中的出现次数之差,因此可以使用一个哈希表记录每个字符在两个字符串中的出现次数之差。具体做法是,遍历字符串 s s s 和 t t t,将字符串 s s s 中的每个字符的出现次数减 1 1 1,将字符串 t t t 中的每个字符的出现次数加 1 1 1。遍历两个字符串结束之后,遍历哈希表,对于每个字符,如果出现次数之差为正,则将出现次数之差加到最少替换次数,遍历哈希表结束之后即可得到制造字母异位词的最少替换次数。
代码
class Solution {
public int minSteps(String s, String t) {
int length = s.length();
int[] counts = new int[26];
for (int i = 0; i < length; i++) {
char c1 = s.charAt(i), c2 = t.charAt(i);
counts[c1 - 'a']--;
counts[c2 - 'a']++;
}
int steps = 0;
for (int i = 0; i < 26; i++) {
if (counts[i] > 0) {
steps += counts[i];
}
}
return steps;
}
}
复杂度分析
-
时间复杂度: O ( n + ∣ Σ ∣ ) O(n + |\Sigma|) O(n+∣Σ∣),其中 n n n 是字符串 s s s 和 t t t 的长度, Σ \Sigma Σ 是字符集,这道题中 Σ \Sigma Σ 是全部小写英语字母, ∣ Σ ∣ = 26 |\Sigma| = 26 ∣Σ∣=26。需要遍历字符串 s s s 和 t t t 计算每个字母在两个字符串中的出现次数之差,需要遍历哈希表计算最少替换次数。
-
空间复杂度: O ( ∣ Σ ∣ ) O(|\Sigma|) O(∣Σ∣),其中 Σ \Sigma Σ 是字符集,这道题中 Σ \Sigma Σ 是全部小写英语字母, ∣ Σ ∣ = 26 |\Sigma| = 26 ∣Σ∣=26。空间复杂度主要取决于哈希表,需要使用哈希表记录每个字母在两个字符串中的出现次数之差。