A.题目描述:
给定两个字符串 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 只包含小写字母
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-the-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
B.题解思路:
(a)解法1哈希表法
.对于解法1,主要用于练习数据结构中的hash表,我们用数组创建一个hash表,再存入s与t中的字母,当查找到s中的字母是在其索引位置做加1操作,当查找到t中字母时做减1操作,最后遍历数组,不为0的即为不同的字母。
在此题解中可以学到两种比较有用的解题技巧,(1):如何用数组创建hash表并将26个英文字母存入,即用内置函数获取字母的ASCII码并减去'a',再在一个循环中依次存入26个字母(可能解释的不怎么清楚,请看代码,并会一目了然)(2):如何不开辟而外的空间去做比较的操作,即在一个数组的基础上做加1和减1操作,如果有额外的字母其索引处的值一定不为0!!!
(b).代码:
class Solution {
//Hash Table
//N is the size of t
//Time complexity: O(N)
//Space complexity :O(1)
public char findTheDifference(String s, String t) {
int sizeS = s.length();
int sizeT = t.length();
//如果s为0则t中只有一个字母,直接返回
if (sizeS == 0) {
return t.charAt(0);
}
int[] table = new int[26];
for (int i = 0; i < sizeT; i++) {
if (i < sizeS) { //对于s,每个数字都加1
table[s.charAt(i) - 'a']++;
}
table[t.charAt(i) - 'a']--; //对于t,每个数字都减去1
}
//此时入果hash表中的某个元素不为0,则为多出来的哪一个字母
for (int i = 0; i < 26; i++) {
if (table[i] != 0) {
return (char)('a' + i);
}
}
return 'a';
}
}
(c)补充解释:
for (int i = 0; i < sizeT; i++) {
if (i < sizeS) { //对于s,每个数字都加1
table[s.charAt(i) - 'a']++;
}
table[t.charAt(i) - 'a']--; //对于t,每个数字都减去1
}
//此时入果hash表中的某个元素不为0,则为多出来的哪一个字母
for (int i = 0; i < 26; i++) {
if (table[i] != 0) {
return (char)('a' + i);
}
对于第一个for循环的操作,其实通过charArt()函数获取每个字母的ASCii码减去'a'作为hash表的索引,这样就可以使用连续的空间将26个英文字母存入,如果要得到对应的字母时再将其通过(char)('a' + 索引值)的操作将其获取,这也是第二个for循环做的操作。
(b)解法2:算数运算法:
定义一个total变量存储t中每个字母的ASCII码值的总和,再减去s中每个字母的ASCII码值的总和,最后得到的差值就是所求的不同元素的ASCII码,再将其转换为char类型返回
代码:
class Solution {
//加法运算
//N is the size of t
//Time complexity: O(N)
//Space complexity; O(1)
public char findTheDifference(String s, String t) {
int sizeS = s.length();
int sizeT = t.length();
int total = 0; //记录所有的字母的AScll码之和
//用t中所有字母的AScall码减去s中所有字母的Acsall码值
//再次强转为char类型返回
for (int i = 0; i < sizeT; i++) {
total += t.charAt(i);
if (i < sizeS) {
total -= s.charAt(i);
}
}
return (char)total;
}
}