【每日算法】力扣387. 字符串中的第一个唯一字符 & 383. 赎金信 & 242. 有效的字母异位词

199 阅读3分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。

前言

这三道题比较类似,所以就放在一起了。

image.png

难怪力扣的练习题也是放在一起的。

387. 字符串中的第一个唯一字符

描述

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。  

示例:

s = "leetcode"
返回 0

s = "loveleetcode"
返回 2

 

提示:你可以假定该字符串只包含小写字母。

做题

思路

我们可以遍历一遍,把字符出现的次数存储在哈希表中。

遍历第二个字符串数组的时候,当遍历到字符出现次数为 1 (存在且只有一个)时,就直接返回字符。

因为这里存入哈希表的元素只有 26 个(小写字母),所以我们可以使用长度为 26 的数字代替哈希表。

public int firstUniqChar(String s) {
        int[] array=new int[26];
        //char(97)=a
        char[] chars = s.toCharArray();
        for(int i=0; i<chars.length;i++){
            array[ (int)chars[i]-97]++;
        }
        for(int i=0; i<chars.length;i++){
            if(array[ (int)chars[i]-97] == 1){
                return i;
            }
        }
        return -1;
    }

image.png

383. 赎金信

描述

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

示例 1:

输入:ransomNote = "a", magazine = "b"
输出:false
示例 2:

输入:ransomNote = "aa", magazine = "ab"
输出:false
示例 3:

输入:ransomNote = "aa", magazine = "aab"
输出:true

做题

思路

名字取得花里胡哨,但跟387. 字符串中的第一个唯一字符差不多,也是需要创建要给哈希表来存储字符出现的次数。

然后再遍历第二个字符串,去抵消哈希表中字符的次数,当次数小于 0 时,就返回 false。

public boolean canConstruct(String ransomNote, String magazine) {
        int[] array=new int[26];
        char[] chars1 = magazine.toCharArray();
        for(int i=0; i<chars1.length;i++){
            array[ (int)chars1[i]-97]++;
        }
        char[] chars2 = ransomNote.toCharArray();
        for(int i=0;i<chars2.length;i++){
            if(array[chars2[i]-97]--<=0){
                return false;
            }
        }
        return true;
    }

image.png

242. 有效的字母异位词

描述

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true
示例 2:

输入: s = "rat", t = "car"
输出: false
 

提示:

1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母

做题

还是跟前面的 387. 字符串中的第一个唯一字符 & 383. 赎金信 一样,需要用到长度为 26 的数组。

因为会出现 “aa” 与 “a” 的情况,所以不能只判断数组的值是否小于 0,而应该严格判断每个元素是否相等。

public boolean isAnagram(String s, String t) {
        //这个代码已经 copy 第二遍了
        int[] array1 = new int[26];
        char[] chars1 = s.toCharArray();
        for(int i=0; i<chars1.length;i++){
            array1[ (int)chars1[i]-97]++;
        }
        int[] array2 = new int[26];
        char[] chars2 = t.toCharArray();
        for(int i=0; i<chars2.length;i++){
            array2[ (int)chars2[i]-97]++;
        }
        for(int i=0; i<26;i++){
            if(array1[i]!=array2[i]){
                return false;
            }
        }
        return true;
    }

image.png

最后

这三道题主要是用到了有限定元素的哈希表都能转换成数组这个思路,其他倒没啥。

今天就到这里了。

这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。