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