题解《算法零基础100讲》(第24讲) 字符串算法 - 字符计数法(java版)

Posted 敲代码的xiaolang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解《算法零基础100讲》(第24讲) 字符串算法 - 字符计数法(java版)相关的知识,希望对你有一定的参考价值。

😁算法小白欢迎加入此社区:https://bbs.csdn.net/forums/hero?category=0
由英雄大佬带领的抱团学算法队伍,从0开始,期待你的加入
🥳

本博文是对此文章习题所作的题解,如有不足,请多指教:https://blog.csdn.net/WhereIsHeroFrom/article/details/121295716

今日题解:
第一题:https://leetcode-cn.com/problems/is-unique-lcci/

我们使用嵌套循环,先把字符串转换为数组,然后遍历即可。

class Solution 
    public boolean isUnique(String astr) 
        char[] c = astr.toCharArray();
        int i,j;
        for(i = 0; i < c.length; i++)
            for(j = i + 1 ; j < c.length; j++)
                if(c[i] == c[j])
                    return false;
                
            
        
        return true;
    

第二题:https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof/

我们先遍历一遍数组,把出现的字母存到数组里面,然后再进行一次遍历,如果出现了出现次数是1的字母就返回。

class Solution 
    public char firstUniqChar(String s) 
        int l = s.length();
        int[] array = new int[80];
        int i,j;
        char c;
        for (i = 0; i < l; i++)
            c = s.charAt(i);
            array[c - 'a']++;
        
        for (i = 0; i < l; i++)
            c = s.charAt(i);
            if (array[c - 'a'] == 1)
                return c;
            
        
        return ' ';
    

第三题:https://leetcode-cn.com/problems/ransom-note/

我们先遍历一遍数组,遇到了就统计出现的次数,然后再进行一次循环遍历,如果他的次数是0,就代表还没有出现过,直接返回false,否则我们进行一次次数的抵消。

class Solution 
    public boolean canConstruct(String ransomNote, String magazine) 
        char[] count = new char[80];
        int  i;
        for (i = 0; i < magazine.length(); i++) 
            count[magazine.charAt(i) - 'a']++;
        
        for (i = 0; i < ransomNote.length(); i++) 
            if (count[ransomNote.charAt(i) - 'a'] == 0) 
                return false;
            else
                count[ransomNote.charAt(i)- 'a']--;
            
        
        return true;
    


第四题:https://leetcode-cn.com/problems/jewels-and-stones/

比较简单,直接遍历即可。

class Solution 
    public int numJewelsInStones(String jewels, String stones) 
        char[] c1 = jewels.toCharArray();
        char[] c2 = stones.toCharArray();
        int i,j,count=0;
        for(i = 0; i < c1.length; i++)
            for(j = 0; j < c2.length; j++)
                if(c1[i] == c2[j])
                    count++;
                
            
        
        return count;
    

第五题:https://leetcode-cn.com/problems/check-permutation-lcci/

先排序,然后比较两个数组是否相等,相等即满足题目的要求。

class Solution 
    public boolean CheckPermutation(String s1, String s2) 
        char[] c1 = s1.toCharArray();
        char[] c2 = s2.toCharArray();
        Arrays.sort(c1);
        Arrays.sort(c2);
        if(Arrays.equals(c1, c2))
            return true;
        else
            return false;
        
    


第六题:https://leetcode-cn.com/problems/check-if-all-characters-have-equal-number-of-occurrences/

class Solution 
    public boolean areOccurrencesEqual(String s) 
        int[] array=new int[26];
        int i,j;
        for(i=0; i<s.length(); i++)
            array[s.charAt(i)-'a']++;
        
        for(i=0; i<26; i++)
            if(array[s.charAt(0)-'a']!=array[i] && array[i]!=0)
/*我每一个字符出现的次数一样,我才可以算作是好字符串,
所以array[s.charAt(0)-'a']!=array[i]就代表有一个字符的次数与其他的不一样,
并且array[i]!=0,也就是这个字符确实存在于你的输入里面,那么此时不符合题意。*/
                return false;
                
            
        return true;
    


第七题:https://leetcode-cn.com/problems/valid-anagram/

先排序,然后比较是否相等,思路也很简单。

class Solution 
    public boolean isAnagram(String s, String t) 
        char[] c1 = s.toCharArray();
        char[] c2 = t.toCharArray();
        Arrays.sort(c1);
        Arrays.sort(c2);
        if(Arrays.equals(c1, c2))
            return true;
        else
            return false;
        
    


第八题:https://leetcode-cn.com/problems/dKk3P7/

思路也可以将上一道题的思路反过来,我们先判断是否是不完全相同,然后再判断里面所含的字母是否完全相同。

class Solution 
    public boolean isAnagram(String s, String t) 
        char[] c1 = s.toCharArray();
        char[] c2 = t.toCharArray();
        int i,j,flag=1;
        for(i = 0; i < c1.length; i++)
            for(j = 0; j < c2.length; j++)
                if(c1[i] != c2[j])
                    flag = 1;
                    break;
                else
                    flag = 0;
                
            
        
        if(flag == 1)
            Arrays.sort(c1);
            Arrays.sort(c2);
            if(Arrays.equals(c1, c2))
                return true;
            else
                return false;
            
        else
            return false;
        
    


第九题:https://leetcode-cn.com/problems/check-if-the-sentence-is-pangram/

先定义一个数组,我们先把字母表存进去,然后我们遍历我们的字符串,如果包含,我们就定义一个变量,并且跳出判断,只有当判断到最后一个字母并且变量值符合条件,我们才会返回true,否则返回false。

class Solution 
    public boolean checkIfPangram(String sentence) 
         char[] Zimu = new char[]'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z';
         int i,j;
         char[] c = sentence.toCharArray();
         for(i = 0; i < 26; i++) 
            int flag = 0;
            for(j = 0; j < sentence.length(); j++) 
                if(Zimu[i] == sentence.charAt(j))
                    flag = 1;
                    break;
                
            
            if(flag == 0)
                return false;
            
            if(flag == 1)
                continue;
            
            if(flag == 1 && i == 25)
                return true;
            
        
        return true;
    


第十题:https://leetcode-cn.com/problems/kth-distinct-string-in-an-array/

第一次遍历,将arr数组中所有的字符串保存到哈希表中,其中哈希表的key保存字符串,value保存每个字符串出现次数。第二次遍历,将哈希表中只出现一次的字符串添加到ArrayList中。

class Solution 
    public String kthDistinct(String[] arr, int k) 
        Map<String, Integer> map = new HashMap<>();
        int i;
        for (i = 0; i < arr.length; i ++) 
            map.put(arr[i], map.getOrDefault(arr[i], 0) + 1);
        
        List<String> list = new ArrayList<>();
        for (i = 0; i < arr.length; i ++) 
            if (map.get(arr[i]).equals(1)) 
            //如果arr[i]所对应的出现次数等于1,表示这个只出现过1次
                list.add(arr[i]);
            
        
        if(list.size() < k)
            return "";
        else//若k比list的长度还大,返回空,否则,返回list中第(k - 1)个元素
            return list.get(k - 1);
        
    

有问题欢迎留言,欢迎加入“万人千题”社区,在这里一起努力。

以上是关于题解《算法零基础100讲》(第24讲) 字符串算法 - 字符计数法(java版)的主要内容,如果未能解决你的问题,请参考以下文章

《算法零基础100讲》(第24讲) 字符串算法 - 字符计数法

题解《算法零基础100讲》(第26讲) 字符串算法 - 回文串(java版)

题解《算法零基础100讲》(第22讲) 字符串算法 - 字符串比较(java版)

题解《算法零基础100讲》(第6讲) 日期算法(java版)

题解《算法零基础100讲》(第16讲) 变量交换算法(java版)

题解《算法零基础100讲》(第7讲---丑数) (java版)