【算法集训专题攻克篇 】第二篇之字符串

算法集训传送门

  👉引言

在这里插入图片描述

铭记于心
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉

💖 我们的算法之路💖

   众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨。
               ☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️
   💝二分,💝贪心,💝并查集,💝二叉树,💝图论,💝深度优先搜索(dfs),💝宽度优先搜索(bfs),💝数论,💝动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉


今日主题:字符串


 👉第一题💎

   ✨题目

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

   ✨思路

思路

   ✨代码
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);
}
};

 👉第二题💎

   ✨题目

      551. 学生出勤记录 I

首先遍历一遍找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;
}
};

 👉第三题💎

   ✨题目

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

   ✨思路

遍历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;
}
};

 👉第四题💎💎

   ✨题目

      1071. 字符串的最大公因子

   ✨思路

首先当两个字符串长度相等时,那么如果要满足题设条件,它们就必须完全相同,大家可以举出一些例子试试。
其次找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 "";
	}
};

  💎总结💎

前三道都很简单,一般就是简单的查找,第四道呢就有些小麻烦了,因为需要判断各种边界条件,以及分情况讨论。当然上面代码都是我自己敲出来的,主要是以解题为目的,并没有追求时间复杂度,毕竟对于新手来说,先解出题才是正道,如果大家对优化感兴趣,可以去官方题解区寻找最优解哦!

写在最后
相信大家对今天的集训内容的理解与以往已经有很大不同了吧,或许也感受到了算法的魅力,当然这是一定的,路漫漫其修远兮,吾将上下而求索!伙伴们,明天见!

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想new的出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值