力扣:389. 找不同

166 阅读1分钟

「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

描述

给定两个字符串 st,它们只包含小写字母。

字符串 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 <= 1000
  • t.length == s.length + 1
  • st 只包含小写字母

解析

哈希表是比较容易想到的方法,用一个哈希表记录每个元素出现的次数,由于只有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%的用户