leetcode 389.找不同

leetcode 389.找不同

题干

给定两个字符串 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 <= 1000
t.length == s.length + 1
s 和 t 只包含小写字母

题解

既然t是s的随机排序,那就干脆把两个全部重排,然后遍历短的,查找第一个下标对应不同字母的出现位置,如果遍历过程中没有出现,说明插入的字母在最后一位。

class Solution {
public:
    char findTheDifference(string s, string t) {
        sort(s.begin(),s.end());
        sort(t.begin(),t.end());
        for(int i = 0 ; i < s.length() ; ++i){
            if(t[i] != s[i]){
                return t[i];
            }
        }   
        return t[t.length()-1];
    }
};

不想排序还可以用经典数组储存,统计两个字符串中字母出现的个数,s出现++t出现–,若最后不为0则说明这个字母就是多出来的字母

class Solution {
public:
    char findTheDifference(string s, string t) {
        vector<int> count(26,0);
        for(int i = 0 ; i < s.length() ; ++i){
            count[s[i] - 'a']++;
            count[t[i] - 'a']--;
        }
        count[t[t.length() - 1] - 'a']--;
        for(int i = 0 ; i < 26 ; ++i){
            if(count[i] != 0){
                char alpha = 'a' + i;
                return alpha;
            }
        }
        return NULL;
    }
};

或者不想用数组,直接一点就用unordered_map(会慢一点)

class Solution {
public:
    char findTheDifference(string s, string t) {
        unordered_map<char,int> count;
        for(int i = 0 ; i < s.length() ; ++i){
            count[s[i]]++;
            count[t[i]]--;
        }
        count[t[t.length() - 1]]--;
        for(int i = 0 ; i < 26 ; ++i){
            char temp = 'a' + i;
            if(count[temp] != 0){
                return temp;
            }
        }
        return NULL;
    }
};

位运算属实妙极:遍历两个字符串,在t中新加的字母总的出现次数一定是奇数次,而其他字母一定是偶数次,所以只要取0对全部字符的ascii码不断异或,最后结果一定是新加字母的ascii码
0和任意二进制数按位异或得到的结果都是其原样,而任意二进制数和自身按位异或得到的结果都是0,即0和任意数a异或n次,n为奇数时结果为a,n为偶数时结果为0

class Solution {
public:
    char findTheDifference(string s, string t) {
        int ret = 0;
        for (char ch: s) {
            ret ^= ch;
        }
        for (char ch: t) {
            ret ^= ch;
        }
        return ret;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值