> 文档中心 > 【复盘】六月集训(第02天)——字符串

【复盘】六月集训(第02天)——字符串

【复盘】六月集训(第02天)——字符串

    • 一、前言
    • 二、题目链接
    • 三、解题思路
      • 1. 字母在字符串中的百分比
      • 2.学生出勤记录 I
      • 3. 统计是给定字符串前缀的字符串数目
      • 4. 字符串的最大公因子

一、前言

本篇文章是根据英雄哥的六月集训的直播刷题写的复盘。
今天是第二天,继续加油!
若有不对的地方,欢迎大佬们批评指正。

二、题目链接

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

三、解题思路

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

  • 遍历一遍字符串计算出letter的数量再除以s的长度即可。
class Solution {   public static int percentageLetter(String s, char letter) { char[] chars = s.toCharArray(); int num = 0; String let =  String.valueOf(letter); for(int i = 0;i < chars.length;i++) {     String tmp = String.valueOf(chars[i]);     if(tmp.equals(let)) {  num++;     } } return (num*100/chars.length);    }}

2.学生出勤记录 I

  • 先遍历数组计算出A的数量,判断A的数量是否小于2,再判断字符串是否包含LLL,两个条件都满足即返回true
class Solution {    public boolean checkRecord(String s) { int absebt = 0; boolean late = false; char[] tmp = s.toCharArray(); for(int i = 0;i < tmp.length;i++) {     if(tmp[i] == 'A') {  absebt++;     } } return absebt < 2 && !s.contains("LLL");    }}

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

  • 先遍历words数组,然后判断s是否包含words[i],若不包含则words[i]肯定不是s的前缀
  • 若 s包含words[i],则遍历words[i]判断是否是s的前缀,若是,则res++
class Solution {    public int countPrefixes(String[] words, String s) { char[] tmp = s.toCharArray(); int res = 0; for(int i = 0;i < words.length;i++) {     if(words[i].length() > s.length()) {  continue;     }     if(s.contains(words[i])) {  for(int j = 0;j < words[i].length();j++) {      if(words[i].charAt(j) != s.charAt(j)) {   break;      }else if(j == words[i].length() - 1){   res++;      }  }     } } return res;    }}

4. 字符串的最大公因子

  • 先判断是否存在 字符串的最大公因子,若存在,则利用辗转相除法算出最大公约数,字符串的最大公因子的长度就是最大公约数。然后在str1或者str2从头截取最大公约数长度的子串即可。

什么是辗转相除法(GCD)呢?
例如,我们求24和60的最大公约数,假设最大公约数为m,所以24和60都可以被m整除,60可以表示为24+36,所以36也可以被m整除,所以问题就转化为求24和36的最大公约数,而36可以表示为24+12,以此类推,知道其中一个为0为止。

class Solution {    public String gcdOfStrings(String str1, String str2) {    //判断是否存在 字符串的最大公因子 if(!(str1 + str2).equals(str2 + str1)) {     return ""; } return str1.substring(0,gcd(str1.length(),str2.length()));    }    //辗转相除法    public int gcd(int a,int b) { int remainder = a % b; while (remainder != 0) {     a = b;     b = remainder;     remainder = a % b; } return b;    }}