持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
一、题目描述:
给定两个字符串
s和t,它们只包含小写字母。字符串
t由字符串s随机重排,然后在随机位置添加一个字母。请找出在
t中被添加的字母。
示例 1:
输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。
示例 2:
输入:s = "", t = "y"
输出:"y"
提示:
- 0 <= s.length <= 1000
- t.length == s.length + 1
- s 和 t 只包含小写字母
二、思路分析:
使用一个集合来存储s中的元素以及他们对应出现的次数,将s中的每个元素出现次数都为存为1 如果出现两次,则次数加一,遍历t中的字符 判断t中的字符是否在s中出现,如果出现,将其次数减一, 然后遍历下一个元素,当找到不存在或者出现次数已经为零的元素便是多于的字符
三、AC 代码:
public char findTheDifference(String s, String t) {
//使用一个Map集合来存储所有元素及其出现的次数
Map<Character,Integer> chars = new HashMap<>();
char[] ss = s.toCharArray();
//循环字符串s,将所有的字符存到map中
for(char sc : ss){
//如果同一个元素出现第二次 则让其出现次数加一
if(chars.containsKey(sc)){
int newCount = chars.get(sc) + 1;
chars.put(sc,newCount);
//并跳过这次循环 否则会出现再次添加为1的情况
continue;
}
//将字符及其出现次数存入到集合中
chars.put(sc,1);
}
//遍历字符串t 用字符串t中的字符去map集合中找到对应的元素 并将其出现次数-1
char[] ts = t.toCharArray();
for(char tc : ts){
//情况一:字符没有在集合中出现 则直接返回
if(!chars.containsKey(tc)){
return tc;
}
//情况二:字符的出现次数已经为0 证明多于了
if(chars.get(tc) == 0){
return tc;
}
//如果不是前两种情况 就是合理的元素 让他们的出现次数减1
int newCount = chars.get(tc) - 1;
chars.put(tc,newCount);
}
//如果没有多于的元素
return '-';
}