夯实算法-使两字符串互为字母异位词的最少步骤数

121 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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
解释: 给出的字符串已经互为字母异位词。因此,不需要任何进一步操作。

提示:

  • 1<=s.length,t.length<=21051 <= s.length, t.length <= 2 * 10^5
  • 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;
}

运行结果

Snipaste_2023-02-28_22-53-19.png

复杂度分析

  • 空间复杂度:O(1)O(1)
  • 时间复杂度:O(n)O(n)

掘金(JUEJIN)  一起分享知识, Keep Learning!