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

Posted 敲代码的xiaolang

tags:

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

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

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

今日题解:
第一题:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/

第一看想到的就是调用java自带的方法。

class Solution {
    public String replaceSpace(String s) {
       return s.replace(" ","%20");
    }
}

也可以定义动态数组,使用StringBuilder来求解,这个我开始没想到,看的评论区的大佬想法。

class Solution {
    public String replaceSpace(String s) {
        StringBuilder arr = new StringBuilder();
        int i;
        for(i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            if(c == ' '){
                arr.append("%20");
            }else{
                arr.append(c);
            }
        }
        return arr.toString();
    }
}

第二题:https://leetcode-cn.com/problems/sparse-array-search-lcci/

我的想法比较菜,开始想到的就是直接遍历,然后使用java方法来判断。

class Solution {
    public int findString(String[] words, String s){
        int i;
        for(i = 0; i < words.length; i++){
            if(words[i].equals(s)){
                return i;
            }
        }
        return -1;
    }
}

当然这个题最好的解法是使用二分法,只不过当前位置为" ",我们定义的mid要进行前移,再放一个二分的大佬解法。

class Solution {
    public int findString(String[] words, String s) {
        int l = 0, r = words.length - 1;
        while(r >= l){
            int mid = (l + r)/2;
            while(mid > l &&  words[mid].equals("")){
                mid--;
            }
            if(s.compareTo(words[mid]) == 0){
                return mid;
            }
            if(s.compareTo(words[mid]) < 0){
                r = mid - 1;
            }else{
                l = mid + 1;
            }
        }
        return -1;
    }
}


第三题:https://leetcode-cn.com/problems/word-pattern/

本题开始没想到解法,看了大佬的题解,这里就写一个大佬题解的注释了。

class Solution {
    public boolean wordPattern(String pattern, String str) {
        String[] words = str.split(" ");
        if (words.length != pattern.length()) {
        // 字符和单词是一一对映的,数量必须相等
            return false;
        }
        Map<Object, Integer> map = new HashMap<>();
        for (Integer i = 0; i < words.length; i++) {
        //如果键值不存在,插入成功,返回null;如果键值存在,返回之前对应的value。
            if (map.put(pattern.charAt(i), i) != map.put(words[i], i)) {
                return false;
            }
        }
        return true;
    }
}


第四题:https://leetcode-cn.com/problems/decrypt-string-from-alphabet-to-integer-mapping/

暴力枚举,直接写出所有的情况。这里先要写 10# 的情况,因为先写 1,可能会把 10# 误认为1。

class Solution {
    public String freqAlphabets(String s) {
        String n1 = s.replaceAll("10#","j");
        String n2 = n1.replaceAll("11#","k");
        String n3 = n2.replaceAll("12#","l");
        String n4 = n3.replaceAll("13#","m");
        String n5 = n4.replaceAll("14#","n");
        String n6 = n5.replaceAll("15#","o");
        String n7 = n6.replaceAll("16#","p");
        String n8 = n7.replaceAll("17#","q");
        String n9 = n8.replaceAll("18#","r");
        String n10 = n9.replaceAll("19#","s");
        String n11 = n10.replaceAll("20#","t");
        String n12 = n11.replaceAll("21#","u");
        String n13 = n12.replaceAll("22#","v");
        String n14 = n13.replaceAll("23#","w");
        String n15 = n14.replaceAll("24#","x");
        String n16 = n15.replaceAll("25#","y");
        String n17 = n16.replaceAll("26#","z");
        String n18 = n17.replaceAll("1","a");
        String n19 = n18.replaceAll("2","b");
        String n20 = n19.replaceAll("3","c");
        String n21 = n20.replaceAll("4","d");
        String n22 = n21.replaceAll("5","e");
        String n23 = n22.replaceAll("6","f");
        String n24 = n23.replaceAll("7","g");
        String n25 = n24.replaceAll("8","h");
        String n26 = n25.replaceAll("9","i");
        return n26;
    }
}

大佬使用的逆序遍历,实现起来也是比较简单的。

class Solution {
    public String freqAlphabets(String s) {
        StringBuilder sb = new StringBuilder();
        int i = s.length() - 1;
        while(i >= 0){
        //先倒过来找'#',碰到了就是二位数,否则是一位数
            if(s.charAt(i) == '#'){
                i = i - 2;
                int x = Integer.parseInt(s.substring(i, i + 2));
                sb.append((char)('a' + x - 1));
            }else{
                int x = s.charAt(i) - '0';
                sb.append((char)('a' + x - 1));
            }
            i--;
        }
        sb.reverse();
        return sb.toString();
    }
}


第五题:https://leetcode-cn.com/problems/number-of-strings-that-appear-as-substrings-in-word/

第一想法嵌套循环,先循环数组长度,然后再遍历字符串的位数,使用substring方法,然后再进行比较。

class Solution {
    public int numOfStrings(String[] patterns, String word) {
        int i,j,k,t;
        int count = 0;
        for(i = 0; i < patterns.length; i++){
            t = 0;
            for(j = 0; j < word.length(); j++){
                for(k = j; k <= word.length(); k++){
                    if(word.substring(j,k).equals(patterns[i])){
                        count ++;
                        t = 1; 
                        break;
                    }
                    if (t == 1){
                        break;
                    }
                }
            }
        }
        return count;
    }
}

大佬有更好的解法,调用java里的contains方法。

class Solution {
    public int numOfStrings(String[] patterns, String word) {
        int number = 0;
        for(String s:patterns){
            if(word.contains(s)){
                number++;
            }
        }
        return number;
    }
}

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

近几天所欠的题解会尽快补上。

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

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

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

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

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

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

题解《算法零基础100讲》(第17讲) 线性枚举 - 最值算法(java版)