前言
此为《英雄算法联盟:算法集训》的内容,具体内容详见:知识星球:英雄算法联盟 - 六月集训。加入星球后,即可享用星主 CSDN付费专栏 免费阅读 的权益。
欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
希望大家先自己思考,如果实在没有想法,再看下面的算法思路,如果有思路但是写不出来,可以参考朋友圈中其他人的代码,总有一款是适合你的,关注一下他,取其之长,补给之短。
今天集训的内容是:字符串
今天的题,前三题比较简单,第四题代码量稍微长一些,但是也比较简单,务必全部做掉。
一、练习题目
题目链接 | 难度 |
---|---|
2278. 字母在字符串中的百分比 | ★☆☆☆☆ |
551. 学生出勤记录 I | ★☆☆☆☆ |
2255. 统计是给定字符串前缀的字符串数目 | ★☆☆☆☆ |
1071. 字符串的最大公因子 | ★★☆☆☆ |
二、算法思路
1、字母在字符串中的百分比
(1)直接一个线性枚举,统计给定字符的个数,然后乘上100以后除上字符串长度即可。
class Solution {
public:
int percentageLetter(string s, char letter) {
int lcnt = 0;
for(int i = 0; i < s.size(); ++i) {
if(s[i] == letter) {
++lcnt;
}
}
return lcnt * 100 / s.size();
}
};
2、学生出勤记录 I
(1)记录A 的个数,如果大于等于两个则直接返回 false;
(2)判断连续三个 L ,如果存在直接返回 false;
(3)以上都不存在则返回 true。
class Solution {
public:
bool checkRecord(string s) {
int i;
int acnt = 0;
for(i = 0; i < s.size(); ++i) {
if(s[i] == 'A') {
++acnt;
if(acnt >= 2) {
return false;
}
}
if(i + 2 < s.size()) {
if(s[i] == 'L' && s[i+1] == 'L' && s[i+2] == 'L') {
return false;
}
}
}
return true;
}
};
3、统计是给定字符串前缀的字符串数目
(1)这个题就是一个枚举加上一个判定,枚举每个字符串,判断它是否是给定字符串的前缀;
(2)判断前缀可以采用枚举,一个一个字符比较即可;
class Solution {
bool isPrefix(string& pre, string& s){
if(pre.size() > s.size()) {
return false;
}
for(int i = 0; i < pre.size(); ++i) {
if(pre[i] != s[i]) {
return false;
}
}
return true;
}
public:
int countPrefixes(vector<string>& words, string s) {
int ret = 0;
for(int i = 0; i < words.size(); ++i) {
if(isPrefix( words[i], s) ) {
++ret;
}
}
return ret;
}
};
4、字符串的最大公因子
(1)首先,求出两个字符串长度对应的最大公因子;
(2)然后枚举最大公因子的倍数,分别判断是否是两个字符串的串因子;
(3)串因子可以采用两层循环进行判定,如下代码中的 isGCDString ;
class Solution {
int gcd(int a, int b) {
return !b ? a : gcd(b, a%b);
}
bool isGCDString(int len, const string& str1, const string& str2) {
int i, j, k;
k = str1.size() / len;
for(i = 0; i < k; ++i) {
for(j = 0; j < len; ++j) {
if(str1[i * len + j] != str1[j]) {
return false;
}
}
}
k = str2.size() / len;
for(i = 0; i < k; ++i) {
for(j = 0; j < len; ++j) {
if(str2[i * len + j] != str1[j]) {
return false;
}
}
}
return true;
}
public:
string gcdOfStrings(string str1, string str2) {
int g = gcd(str1.size(), str2.size());
int len = 0;
for(int i = 1; ; ++i) {
int l = i * g;
if(l > str1.size() || l > str2.size()) {
break;
}
if(str1.size() % l || str2.size() % l) {
break;
}
if( !isGCDString(l, str1, str2) ) {
break;
}else {
len = l;
}
}
string ret = "";
for(int i = 0; i < len; ++i) {
ret += str1[i];
}
return ret;
}
};