📜个人简介 |
⭐️个人主页:摸鱼の文酱博客主页🙋♂️
🍑博客领域:java编程基础,mysql
🍅写作风格:干货,干货,还是tmd的干货
🌸精选专栏:【Java】【mysql】 【算法刷题笔记】
🎯博主的码云gitee,平常博主写的程序代码都在里面。
🚀支持博主:点赞👍、收藏⭐、留言💬
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
文章目录
今日学习内容:字符串
题目链接 | 难度 |
---|---|
2278. 字母在字符串中的百分比 | easy |
551. 学生出勤记录 I | easy |
2255. 统计是给定字符串前缀的字符串数目 | easy |
1071. 字符串的最大公因子 | easy |
📃2278. 字母在字符串中的百分比
🎯解题思路
📒思路一:枚举
1.思路一:将字符串中的每一个字符依次取出与给定字符比较,一样就计数器加一,最后除以字符串长度得出数字
public int percentageLetter(String s, char letter)
{
int n = s.length();
int cnt = 0;
for (int i = 0; i < s.length(); i ++)
{
if (s.charAt(i) == letter)
{
cnt ++;
}
}
int res = (int)((double)cnt / n * 100);
return res;
}
📃551. 学生出勤记录 I
🎯解题思路
📒思路一:遍历
1.思路一:将记录依次取出 记录A的数量,大于或等于两个false 判断连续L的数量,达到三个连续的false
其余情况true
class Solution {
public boolean checkRecord(String s) {
int n = s.length();
char[] cs = s.toCharArray();
for (int i = 0, cnt = 0; i < n; ) {
char c = cs[i];
if (c == 'A') {
cnt++;
if (cnt >= 2) return false;
} else if (c == 'L') {
int j = i;
while (j < n && cs[j] == 'L') j++;
int len = j - i;
if (len >= 3) return false;
i = j;
continue;
}
i++;
}
return true;
}
}
📃2255. 统计是给定字符串前缀的字符串数目
🎯解题思路
📒思路一:遍历+库函数
class Solution {
public int countPrefixes(String[] words, String s) {
int cnt = 0;
for (String w : words)
if (s.startsWith(w)) cnt++;
return cnt;
}
}
📃1071. 字符串的最大公因子
🎯解题思路
📒思路一:辗转相除法
1.思路一:由题意得知,需要在字符串str1和字符串str2中找寻一个最大的字符串X,使得X可以同时除尽字符串str1和字符串str2。
你品,你细品,“除尽”是不是意味着——字符串str1和str2内只存在一或多个的字符X。
即,字符串str1可由x个字符串X拼接而成,字符串str2可由y个字符串X构成,x、y皆大于等于1。
可得公式,str1 + str2 = (x + y)X。那么同理,str2 + str1 = (y + x)X。
所以只要满足str1 + str2 == str2 + str1,说明了在字符串str1和str2内必存在字符串X。
private int gcd(int a,int b){ //最大公约数
return b==0?a:gcd(b,a%b);
}
public String gcdOfStrings2(String str1, String str2) {
// 假设str1是N个x,str2是M个x,那么str1+str2肯定是等于str2+str1的。
if (!(str1 + str2).equals(str2 + str1)) {
return "";
}
// 辗转相除法求gcd。
return str1.substring(0, gcd(str1.length(), str2.length()));
}
📒思路二:枚举法
1.思路一:首先答案肯定是字符串的某个前缀,然后简单直观的想法就是枚举所有的前缀来判断,我们设这个前缀串长度为
所以我们可以枚举符合长度条件的前缀串,再去判断这个前缀串拼接若干次以后是否等于 str1 和 str2 即可。
由于题目要求最长的符合要求的字符串 X,所以可以按长度从大到小枚举前缀串,这样碰到第一个满足条件的前缀串返回即可。
class Solution {
public String gcdOfStrings(String str1, String str2) {
int len1 = str1.length(), len2 = str2.length();
for (int i = Math.min(len1, len2); i >= 1; --i) { // 从长度大的开始枚举
if (len1 % i == 0 && len2 % i == 0) {
String X = str1.substring(0, i);
if (check(X, str1) && check(X, str2)) {
return X;
}
}
}
return "";
}
public boolean check(String t, String s) {
int lenx = s.length() / t.length();
StringBuffer ans = new StringBuffer();
for (int i = 1; i <= lenx; ++i) {
ans.append(t);
}
return ans.toString().equals(s);
}
}