《算法集训传送门》
👉引言
铭记于心 | ||
---|---|---|
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉 |
💖
我们的算法之路💖
众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨。
☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️
💝二分,💝贪心,💝并查集,💝二叉树,💝图论,💝深度优先搜索(dfs),💝宽度优先搜索(bfs),💝数论,💝动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉
今日主题:字符串
👉第一题💎
✨题目
✨思路:
思路
✨代码:
class Solution {
public:
int percentageLetter(string s, char letter) {
double sum=0;
for (int i = 0; i < s.size(); i++) {
if (letter == s[i]) {
sum++;
}
}
return (int)(sum / s.size() * 100);
}
};
👉第二题💎
✨题目
首先遍历一遍找A的个数,如果大于等于2的话则不满足条件,返回False。然后再遍历一次找是否含有LLL的字符串,其实这道题本质上就是两次遍历查找字符与字符串
✨代码:
class Solution {
public:
bool checkRecord(string s) {int sum = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] == 'A') {
sum++;
}
if (sum >= 2)return false;
}
if (s.find("LLL") != string::npos) {
return false;
}; return true;
}
};
👉第三题💎
✨题目
✨思路:
遍历words数组中的每一个字符串,去s里找是不是前缀
✨代码:
class Solution {
public:
int countPrefixes(vector<string>& words, string s) {
int sum = 0;
for (string str : words) {
//如果找到并且初始位置为0,说明是前缀,计数
if (s.find(str) == 0) {
sum++;
}
}
return sum;
}
};
👉第四题💎💎
✨题目
✨思路:
首先当两个字符串长度相等时,那么如果要满足题设条件,它们就必须完全相同,大家可以举出一些例子试试。
其次找str1与str2的最大公约数co,然后看str1与str2是否都由te组成(te是任意一个字符串的前co个字符组成的字符串),如果有一个不为te则无法完成整除。
最后需要注意的是 当公因子只剩下1时,此时已经是穷途末路,要么成要么败,而成的唯一可能就是两者都由同一个字符组成。
✨代码:
class Solution {
public:
int nextG(int n, int a, int b) {
for (int i = n - 1; i >= 1; i--) {
if ((!(a % i)) && (!(b % i))) {
return i;
}
}
return 1;
}
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
bool find(string s, string tar) {
int in = -1;
int in2 = 0;
while ((in = s.find(tar, in2)) != string::npos)
{
if (in != in2) { return false; }
in2 += tar.size();
}
if (in2 == s.size())return true;
return false;
}
string gcdOfStrings(string str1, string str2) {
int a = str1.size(), b = str2.size();
int co = gcd(a, b);
if (a == b) {
return str1 == str2 ? str1 : "";
}
string res = "";
while (1)
{
string te(str1, 0, co);
if (find(str1, te) &&
find(str2, te))return te;
co = nextG(co, a, b);
if (co == 1) {
char tar = str1[0];
for (char t : str1) {
if (tar != t)return "";
}
for (char t : str2) {
if (tar != t)return "";
}
return (res += tar);
}
}
return "";
}
};
💎总结💎
前三道都很简单,一般就是简单的查找,第四道呢就有些小麻烦了,因为需要判断各种边界条件,以及分情况讨论。当然上面代码都是我自己敲出来的,主要是以解题为目的,并没有追求时间复杂度,毕竟对于新手来说,先解出题才是正道,如果大家对优化感兴趣,可以去官方题解区寻找最优解哦!
写在最后:
相信大家对今天的集训内容的理解与以往已经有很大不同了吧,或许也感受到了算法的魅力,当然这是一定的,路漫漫其修远兮,吾将上下而求索!伙伴们,明天见!