【题解】《算法零基础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;
    }
}

在这里插入图片描述

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

近几天所欠的题解会尽快补上。
在这里插入图片描述

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码的xiaolang

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值