题解《算法零基础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版)