【复盘】六月集训(第02天)——字符串
一、前言
本篇文章是根据英雄哥的六月集训的直播刷题写的复盘。
今天是第二天,继续加油!
若有不对的地方,欢迎大佬们批评指正。
二、题目链接
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;
}
}