leetcode No389. Find the Difference

Posted Dufre.WC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode No389. Find the Difference相关的知识,希望对你有一定的参考价值。

Question

Given two strings s and t which consist of only lowercase letters.
String t is generated by random shuffling string s and then add one more letter at a random position.
Find the letter that was added in t.

Example:

Input:
s = "abcd"
t = "abcde"

Output:
e

Explanation:
'e' is the letter that was added.

Algorithm

看到这一题,第一反应就是用hashmap来做,看答案也有用位运算来做的

  • hashmap
  • 位运算(利用两个相同的数异或为0的特性)

从提交结果来看,C++两者相差不大,位运算的内存消耗稍微少一点。运算速度我预想是hashmap要比位运算快一点,因为位运算要遍历完t中所有的字符才会有结果,而hashmap可以在找到多的字符的时候就立刻返回结果,但是从提交结果来看两者用时相差不大。
Java使用HashMap用时很不理想,只击败了18.75%的用户,因为我使用的是HashMap这个类,而他没有像C++那样,可以将key对应的value自加一(++),而是要先用get取出value,再加1,并且还要判断HashMap中是否包含key,这样就多出了接近O(n)+O(logn)的操作数。另外:(以下描述并不严谨,实际的实现原理其实是比较复杂的,如有错误,也请指出)

  • C++中的unordered_map实现原理是hash_table,查找元素的时间复杂度为O(1)
  • Java中的HashMap的实现原理是红黑树(超过阈值的时候),查找元素的时间复杂度最好为O(1),最差为O(n)

优化的方法也很简单,因为字母就26个,所以改用数组去模拟hashmap就能优化时间

Code

C++
hashmap(unordered_map)

class Solution 
public:
    char findTheDifference(string s, string t) 
        unordered_map<char, int> hash;
        for(auto i : s)
            hash[i]++;
        
        for(auto i : t)
            if (hash[i] == 0)
                return i;
            hash[i]--;
        
        return 0;
    
;

位运算-异或

class Solution 
public:
    char findTheDifference(string s, string t) 
        int res = 0;
        for (auto i : s)
            res^=i;
        for (auto i: t)
            res^=i;
        return res;
    
;

Java

HashMap,击败18.75%的用户

class Solution 
    public char findTheDifference(String s, String t) 
        HashMap<Character, Integer> hash = new HashMap<Character, Integer>();
        for(Character i : s.toCharArray())
            if(hash.containsKey(i))
                hash.put(i, hash.get(i)+1);
            else
                hash.put(i,1);
        
        for(Character i : t.toCharArray())
            if (!hash.containsKey(i) || hash.get(i) == 0)
                return i;
            else
                hash.put(i, hash.get(i)-1);;
        
        return 0;
    

数组

class Solution 
    public char findTheDifference(String s, String t) 
        int[] hash = new int[26];
        for (char i : s.toCharArray())
            hash[i - 'a']++;
        for (char i : t.toCharArray())
            if (hash[i - 'a'] == 0)
                return i;
            else
                hash[i - 'a']--;
        
        return 0;
    

以上是关于leetcode No389. Find the Difference的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] NO. 389 Find the Difference

LeetCode 389. Find the Difference

Leetcode 389 Find the difference

LeetCode 389. Find the Difference

LeetCode_389. Find the Difference

LeetCode:Find the Difference_389