力扣第 282 场周赛 :互为字母异位词的最少步骤数

911 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、问题描述

给你两个字符串 s 和 t 。在一步操作中,你可以给 s 或者 t 追加 任一字符 。

返回使 s 和 t 互为 字母异位词 所需的最少步骤数。

字母异位词 指字母相同但是顺序不同(或者相同)的字符串。

题目链接:使两字符串互为字母异位词的最少步骤数

二、题目要求

样例

输入: s = "leetcode", t = "coats"
输出: 7
解释:
- 执行 2 步操作,将 "as" 追加到 s = "leetcode" 中,得到 s = "leetcodeas" 。
- 执行 5 步操作,将 "leede" 追加到 t = "coats" 中,得到 t = "coatsleede" 。
"leetcodeas" 和 "coatsleede" 互为字母异位词。
总共用去 2 + 5 = 7 步。
可以证明,无法用少于 7 步操作使这两个字符串互为字母异位词。

考察

1.字符串应用,容易超时
2.建议用时15~30min

三、问题分析

一开始我的思路是,遍历字符串s中有的字符而字符串t里面没有的,遍历字符串t中有的字符而字符串s里面没有的,最后输出结果。

重复出现的需要特别计算,所以我搞了一个中间变量s1; 3.png

4.png

但这种方法超时了,剩下20个测试没法通过,超时要优化的痛谁懂。

想起C++的模板库map可以计数,只要计算出两个字符串所有相同的最小字符数,再将两个字符串的总长度减去2倍,不就行了。

上面的例子用map<char,int>a,b;表示如下:

leetcode
c 1  d 1  e 3  l 1  o 1  t 1
coats
a 1  c 1  o 1  s 1  t 1  

两个字符串的字符数目如果有相同的话,选取最小的相同数目。

四、编码实现

class Solution {
public:
    int minSteps(string s, string t) {
        map<char,int>a,b;//定义两个map数组
        int i,m=s.size(),n=t.size(),ans=0;//数据初始化
        char j;
        for(i=0;i<m;i++)
        {
           a[s[i]]++;//对字符串s进行map计数
        }
        for(i=0;i<n;i++)
        {
            b[t[i]]++;//对字符串t进行map计数
        }
         for(j='a'; j <= 'z'; j++)//注意,一开始m['a']这些值初始化为0
        {
            ans+= min(a[j], b[j]);//获取相同公共字符的最小值
        }
        return m+n-2*ans;//返回结果
        
    }
};

五、测试结果

6.png

5.png

执行用时有点长,后面我看看还有没有别的思路。