六月刷题02——字符串


今日刷题内容: 字符串

前言

  • 更新每天刷题的题解内容
  • 注重个人理解,看难度更新题目数量
  • 题目来源于力扣
  • 争取每日都能做出至少一题
  • 语言java、python、c\c++

一、今日题目

  1. 2278. 字母在字符串中的百分比||
  2. 551. 学生出勤记录 I||
  3. 2255. 统计是给定字符串前缀的字符串数目||
  4. 1071. 字符串的最大公因子||

二、解题思路

1. 2278. 字母在字符串中的百分比

  1. 一次遍历得到该字母出现的次数
  2. 用次数*100除于字符串长度n即可
class Solution {
    public int percentageLetter(String s, char letter) {
        int[] hash = new int[256];
        int n = s.length();
        for (char c: s.toCharArray()){
            hash[c]++;
        }
        return (int)(hash[letter] * 100 / n);
    }
}

2. 551. 学生出勤记录 I

  1. 滑动窗口,用左右指针
  2. 右指针用来标记遇到L的长度,左指针自增
  3. 如果字符A次数小于2并且L没有连续出现三次则为真
class Solution {
    public boolean checkRecord(String s) {
        int[] hash = new int[256];
        boolean flag = true;
        int count = 0;
        int l = 0, r = -1, n = s.length();
        char[] arr = s.toCharArray();
        for (char c: arr){
            hash[c]++;
        }
        while(l < n){
            r = l;
            count = 0;
            while (r < n && arr[r] == 'L'){
                count++;
                r++;
                if (count == 3) {
                    flag =  false;
                    break;
                }
            }
            l++;
        }

        if(hash['A'] < 2 && flag){
            return true;
        }
        return false;
    }
}


3. 2255. 统计是给定字符串前缀的字符串数目

  1. 普通模拟,遍历每个单词,找出满足条件的单词
  2. 统计次数即可
class Solution {
    public int countPrefixes(String[] words, String s) {
        char[] arr = s.toCharArray();
        int i, count = 0;
        boolean flag;
        for (String word: words){
            i = 0;
            flag = true;
            for (char c: word.toCharArray()){
                if (i < arr.length && arr[i] == c) i++;
                else{
                    flag = false;
                    break;
                }
            }
            if (flag) count++;
        }

        return count;
    }
}

4. 1071. 字符串的最大公因子

  1. 做的时候只想到了暴力
    本题还有多种解法参照题解
class Solution {
    public String gcdOfStrings(String str1, String str2) {
        if (str1.length() > str2.length()){
            return gcdOfStrings(str2, str1); // 使第一个字符串为长度更小的
        }
        StringBuffer sb = new StringBuffer();
        String ret;
        int i;
        if (str1.length() == 0) return "";
        if (str2.contains(str1)){
            char[] arr1 = str1.toCharArray();
            char[] arr2 = str2.toCharArray();
            for (i = 0; i < arr1.length; i++){
                if (arr1[i] == arr2[i]){
                    sb.append(arr1[i]);
                }
                else{
                    break;
                }
            }
            int len = sb.length();
            if (len == 0) return "";
            for (i = len; i < arr2.length; i++){
                if (arr2[i] != sb.charAt(i % len)){
                    return "";
                }
            }
            ret = sb.toString();
            while (arr2.length % ret.length() != 0 || arr1.length % ret.length() != 0){
                ret = sb.substring(0, len-1);
                len -= 1;
            }

            return ret;
        }
        return "";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值