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;
但这种方法超时了,剩下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;//返回结果
}
};
五、测试结果
执行用时有点长,后面我看看还有没有别的思路。