title: Leetcode 389.找不同
hidden: true
tags:


题目描述

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

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

示例:

输入:
s = "abcd"
t = "abcde"

输出:
e

解释:
'e' 是那个被添加的字母。

题目分析

不用位运算的做法是遍历字符串t, 将t中每一个字符的出现次数存入哈希表, 而后遍历字符串s, 减去每个字符出现次数, 找到那个出现次数为1的字符.

使用位运算做法则是初始化结果res为0, 对s和t的每一位与res取异或, 最后res的值便是多出来的字符.

源码

class Solution { // 不用位运算
public:
    unordered_map<char, int> m;
    string::iterator it;
    char findTheDifference(string s, string t) {
        for(char c='a'; c<='z'; ++c) { // 初始化哈希表m
            m[c] = 0;
        }

        it = t.begin();

        while(it != t.end()) {
            m[*it] = m[*it]+1;
            it++;
        }

        it = s.begin();

        while(it != s.end()) {
            m[*it] = m[*it]-1;
            it++;
        }

        for(char c='a'; c<='z'; ++c) {
            if(m[c] != 0) return c;
        }
        return 0;
    }
};
class Solution { // 使用位运算
public:
    char findTheDifference(string s, string t) {
        char c = 0; // 初始化结果res为0
        s.push_back(0); // 统一s和t的字符数
        for(int i=0; i<t.size(); ++i) {
            c ^= s[i]; // 对res和s[i]取异或
            c ^= t[i]; // 对res和t[i]取异或
        }
        return c;
    }
};