分享

495,位运算等多种方式解找不同

 数据结构和算法 2023-06-10 发布于上海

If you cannot be a poet, be the poem. 

如果你不能成为一个诗人,就活成一首诗。

问题描述



给定两个字符串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多了一个字符,其他字符他们的数量都是一样的。如果我们把字符串s和t合并就会发现,除了那个多出的字符出现奇数次,其他的所有字符都是出现偶数次,看到这里我们很容易想到494,位运算解只出现一次的数字。所以只要是第494题的解我们都可以拿来用。

所以这题最简单的一种解决方式就是使用异或运算,关于异或运算有下面几个规律

  • a^a=0; 任何数字和自己异或都是0

  • a^0=a; 任何数字和0异或还是他自己

  • a^b^c=a^c^b 异或运算具有交换律

因为s和t合并之后,偶数个的字符通过异或都会变为0,奇数个的字符异或之后还是他自己,我们只需要把合并的字符全部异或一遍即可,代码如下

1public char findTheDifference(String s, String t) {
2    char[] charArr = s.concat(t).toCharArray();
3    char res = 0;
4    for (char c : charArr) {
5        res ^= c;
6    }
7    return res;
8}

纯数学的方式解决



既然字符串s比t少一个字符,我们先统计字符串s中每个字符的数量,然后减去字符串t中的每个字符,如果小于0,说明字符串s比t少的就是这个字符,直接返回即可,代码如下

 1public char findTheDifference(String s, String t) {
2    int count[] = new int[26];
3    for (int i = 0; i < s.length(); i++) {
4        count[s.charAt(i) - 'a']++;
5    }
6    for (int i = 0; i < t.length(); i++) {
7        if (--count[t.charAt(i) - 'a'] < 0)
8            return t.charAt(i);
9    }
10    return 'a';
11}

使用结合Set解决



把字符串s和t合并,然后遍历合并的每个字符,判断集合set中是否有这个字符,如果有就移除,否则就加入到集合set中。最后集合set中只有一个字符,这个字符就是我们所求的。

 1public char findTheDifference(String s, String t{
2    Set<Character> set = new HashSet<>();
3    char[] charArr = s.concat(t).toCharArray();
4    for (int i = 0; i < charArr.length; i++) {
5        if (set.contains(charArr[i]))
6            set.remove(charArr[i]);
7        else
8            set.add(charArr[i]);
9    }
10    return (charset.toArray()[0];
11}

其实还可以把contains和add方法合并,如果add失败,说明集合Set中有这个数字,然后再把它给移除即可。

1public char findTheDifference(String s, String t{
2    Set<Character> set = new HashSet<>();
3    char[] charArr = s.concat(t).toCharArray();
4    for (int i = 0; i < charArr.length; i++) {
5        if (!set.add(charArr[i]))
6            set.remove(charArr[i]);
7    }
8    return (charset.toArray()[0];
9}

计算两个字符串的差值



还可以用t中所有字符的和减去s中所有字符的和,最后结果就是要求的那个字符

1public char findTheDifference(String s, String t) {
2    int distance = 0;
3    for (int i = 0; i < s.length(); ++i) {
4        distance -= s.charAt(i);
5        distance += t.charAt(i);
6    }
7    distance += t.charAt(t.length() - 1);
8    return (char) distance;
9}

总结



这题不算难,但解法比较多,位运算应该是最简单的解决方式。

493,动态规划解打家劫舍 III

492,动态规划和贪心算法解买卖股票的最佳时机 II

470,DFS和BFS解合并二叉树

464. BFS和DFS解二叉树的所有路径

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多