「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」
描述
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
- 示例 1:
输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。
- 示例 2:
输入:s = "", t = "y"
输出:"y"
- 示例3
输入:s = "a", t = "aa"
输出:"a"
- 示例4
输入:s = "ae", t = "aea"
输出:"a"
- 提示:
0 <= s.length <= 1000t.length == s.length + 1s和t只包含小写字母
解析
哈希表是比较容易想到的方法,用一个哈希表记录每个元素出现的次数,由于只有26个字母,因此哈希表大小26足以(a对应下标0,b对应下标1,以此类推)。对s中每个字符,出现一次则在哈希表中次数加一;对t中的每个字符,若在s中也有,则哈希表中记录的次数为1,而多出来的那个字母,哈希表记录为0,这就是答案。
复杂度:
- 时间复杂度:O(n)。需要遍历两个字符串。
- 空间复杂度:O(1)。只有26个字母,哈希表大小为26。
示例
class Solution {
public char findTheDifference(String s, String t) {
int[] hash = new int[26];
for(int i = 0; i < s.length(); i++)
hash[s.charAt(i) - 'a']++;
int i;
for(i = 0; i < t.length(); i++)
{
int index = t.charAt(i) - 'a';
if(hash[index] == 0) break;
else hash[index]--;
}
return t.charAt(i);
}
}
解法二:
由于t中除了一个多余的字符外,其余字符和s中一样。则可以联想,两个字符串中所有字符的ASCII值之和相差的数就是多余字符的ASCII值。
复杂度:
- 时间复杂度:O(n)。
- 空间复杂度:O(1)。
示例
class Solution {
public char findTheDifference(String s, String t) {
int sum1 = 0, sum2 = 0;
int len = s.length();
for(int i = 0; i < len; i++)
{
sum1 += s.charAt(i);
sum2 += t.charAt(i);
}
sum2 += t.charAt(len);
return (char)(sum2 - sum1);
}
}
运行结果:
执行结果:通过
执行用时:3 ms, 在所有 Java 提交中击败了85.32%的用户
内存消耗:35.9 MB, 在所有 Java 提交中击败了67.1%的用户