开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 25 天,点击查看活动详情
题目:LeetCode
给你两个字符串 s 和 t 。在一步操作中,你可以给 s 或者 t 追加 任一字符 。
返回使 s 和 t 互为 字母异位词 所需的最少步骤数 。
字母异位词 指字母相同但是顺序不同(或者相同)的字符串。
示例 1:
输入: s = "leetcode", t = "coats"
输出: 7
解释:
- 执行 2 步操作,将 "as" 追加到 s = "leetcode" 中,得到 s = "leetcodeas" 。
- 执行 5 步操作,将 "leede" 追加到 t = "coats" 中,得到 t = "coatsleede" 。
"leetcodeas" 和 "coatsleede" 互为字母异位词。
总共用去 2 + 5 = 7 步。
可以证明,无法用少于 7 步操作使这两个字符串互为字母异位词。
示例 2:
输入: s = "night", t = "thing"
输出: 0
解释: 给出的字符串已经互为字母异位词。因此,不需要任何进一步操作。
提示:
s和t由小写英文字符组成
解题思路
由题意分析:
- 哈希表 maps 统计 s 中每个字符出现的次数
- 遍历 t 中的字符,如果 maps 中存在,则 maps 计数减一,若计数为 0 则删除字符;如果 maps 中不存在字符,则 mapt 中计数
- maps 和 mapt 中剩余的所有计数即为答案
代码实现
public int minSteps(String s, String t) {
Map < Character, Integer > maps = new HashMap < > (), mapt = new HashMap < > ();
for (char ch: s.toCharArray()) {
maps.put(ch, maps.getOrDefault(ch, 0) + 1);
}
for (char ch: t.toCharArray()) {
if (maps.containsKey(ch)) {
int cnt = maps.get(ch);
if (cnt > 1) {
maps.put(ch, cnt - 1);
} else {
maps.remove(ch);
}
} else {
mapt.put(ch, mapt.getOrDefault(ch, 0) + 1);
}
}
int ans = 0;
for (int cnt: maps.values()) {
ans += cnt;
}
for (int cnt: mapt.values()) {
ans += cnt;
}
return ans;
}
运行结果
复杂度分析
- 空间复杂度:
- 时间复杂度:
在掘金(JUEJIN) 一起分享知识, Keep Learning!