给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例:
输入:
s = "abcd"
t = "abcde"
输出:
e
解释:
'e' 是那个被添加的字母。
第一种方法,哈希表。这个太慢了
class Solution {
public char findTheDifference(String s, String t) {
HashMap<Character,Integer> map=new HashMap<Character,Integer>();
if(s==null) return '0';
char[] cs=s.toCharArray();
char[] ct=t.toCharArray();
for(int i=0;i<cs.length;i++){//把s中的所有字符放进哈希表
if(map.containsKey(cs[i])){
map.put(cs[i],map.get(cs[i])+1);
}
else map.put(cs[i],1);
}
for(int i=0;i<ct.length;i++){//把t中的每个字符拿到哈希表中找
if(map.containsKey(ct[i])){
if(map.get(ct[i])-1<0) return ct[i];//找到一个相同的 把value-1
else{
map.put(ct[i],map.get(ct[i])-1);
}
}
else return ct[i];//找不到,说明这个字符在s中没有出现过
}
return '0';
}
}
第二种方法,直接加减值,比哈希表快一些。
最开始,我在处理s时,是逐个字符串相加。在处理t时,逐个字符串相减。但这样的返回值不对。原因是s的值一定是小于等于t的。这样做的结果是,最终返回的值小于等于零,当然返回值是不对的。
class Solution {
public char findTheDifference(String s, String t) {
char[] cs=s.toCharArray();
char[] ts=t.toCharArray();
int temp=0;
for(int i=0;i<s.length();i++){
temp-=(int)cs[i];
}
for(int i=0;i<t.length();i++){
temp+=(int)ts[i];
}
return (char)temp;
}
}
第三种方法,异或,最快。
异或有个交换律。例如s=abcd , t=abcde。 temp=a^b^c^d^a^b^c^d^e = a^a^b^b^c^c^d^d^e = e
class Solution {
public char findTheDifference(String s, String t) {
char[] cs=s.toCharArray();
char[] ts=t.toCharArray();
int temp=0;
for(int i=0;i<s.length();i++){
temp^=(int)cs[i];
}
for(int i=0;i<t.length();i++){
temp^=(int)ts[i];
}
return (char)temp;
}
}