给定两个字符串 s 和 t ,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。

首先遍历字符串 s,对其中的每个字符都将计数值加 1;然后遍历字符串 t,对其中的每个字符都将计数值减 1。当发现某个字符计数值为负数时,说明该字符在字符串 t 中出现的次数大于在字符串 s 中出现的次数,因此该字符为被添加的字符。
class Solution {
public char findTheDifference(String s, String t) {
int[] cnt = new int[26];
for (int i = 0; i < s.length(); ++i) {
char ch = s.charAt(i);
cnt[ch - 'a']++;
}
for (int i = 0; i < t.length(); ++i) {
char ch = t.charAt(i);
cnt[ch - 'a']--;
if (cnt[ch - 'a'] < 0) {
return ch;
}
}
return ' ';
}
}
复杂度分析
将字符串 s 中每个字符的 ASCII 码的值求和,得到 A s A_s As;对字符串 t 同样的方法得到 A t A_t At。两者的差值 A t − A s A_t-A_s At−As 即代表了被添加的字符。
class Solution {
public char findTheDifference(String s, String t) {
int as = 0, at = 0;
for (int i = 0; i < s.length(); ++i) {
as += s.charAt(i);
}
for (int i = 0; i < t.length(); ++i) {
at += t.charAt(i);
}
return (char) (at - as);
}
}
复杂度分析
如果将两个字符串拼接成一个字符串,则问题转换成求字符串中出现奇数次的字符。类似于「136. 只出现一次的数字」,我们使用位运算的技巧解决本题。
class Solution {
public char findTheDifference(String s, String t) {
int ret = 0;
for (int i = 0; i < s.length(); ++i) {
ret ^= s.charAt(i);
}
for (int i = 0; i < t.length(); ++i) {
ret ^= t.charAt(i);
}
return (char) ret;
}
}
复杂度分析
class Solution {
// map计数
public char findTheDifference(String s, String t) {
Map<Character,Integer> map = new HashMap<>();
char[] chars = s.toCharArray();
char[] chart = t.toCharArray();
for (char c : chars) {
map.put(c,map.getOrDefault(c,0)+1);
}
for (char aChar : chart) {
if(map.containsKey(aChar)){
map.put(aChar,map.getOrDefault(aChar,0)-1);
}else {
return aChar;
}
if(map.get(aChar)<0)return aChar;
}
return '1';
}
// 排序
public char findTheDifference(String s, String t) {
char[] chars = s.toCharArray();
char[] chart = t.toCharArray();
Arrays.sort(chars);
Arrays.sort(chart);
for (int i = 0; i < Math.max(chars.length, chart.length); i++) {
if(i==chars.length)return chart[i];
if(chars[i] != chart[i])return chart[i];
}
return '1';
}
}