一、问题描述
给你两个字符串 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步操作使这两个字符串互为字母异位词。
考察
字符串应用,容易超时 建议用时15~30min
三、问题分析
一开始我的思路是,遍历字符串s中有的字符而字符串t里面没有的,遍历字符串t中有的字符而字符串s里面没有的,最后输出结果。
重复出现的需要特别计算,所以我搞了一个中间变量s1;
但这种方法超时了,剩下20个测试没法通过,超时要优化的痛谁懂。
想起C++的模板库map可以计数,只要计算出两个字符串所有相同的最小字符数,再将两个字符串的总长度减去2倍,不就行了。
上面的例子用mapa,b;表示如下:
leetcodec1d1e3l1o1t1coatsa1c1o1s1t1
两个字符串的字符数目如果有相同的话,选取最小的相同数目。
四、编码实现
classSolution { public: intminSteps(strings, stringt) { map<char,int>a,b;//定义两个map数组inti,m=s.size(),n=t.size(),ans=0;//数据初始化charj; 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]);//获取相同公共字符的最小值 } returnm+n-2*ans;//返回结果 } };