前言
来自 英雄哪里出来 的一个 免费 集训,每天
5
5
5 点打卡学习算法(我是为了卷吗,主要是想早起 😏),希望能坚持下去。这里用来复盘每天都的打卡题目。
今日份知识点:字符串
一、题目
题目 | 难度 |
---|---|
2278. 字母在字符串中的百分比 | ⭐️ |
551. 学生出勤记录 I | ⭐️ |
2255. 统计是给定字符串前缀的字符串数目 | ⭐️ |
1071. 字符串的最大公因子 | ⭐️⭐️ |
二、算法思路
1、字母在字符串中的百分比
(1)枚举一遍 s,统计 letter 出现的次数,最后返回百分比即可。 O ( n ) O(n) O(n)
class Solution {
public:
int percentageLetter(string s, char letter) {
int res = 0;
for (int i = 0; i < s.size(); ++ i)
{
if (s[i] == letter)
++ res;
}
return res * 100 / s.size();
}
};
2、学生出勤记录
(1)枚举一遍 s;
(2)统计 A
出现的次数,如果 A
出现的次数大于等于
2
2
2,返回 false;
(3)如果出现 L
,那么要看一下连续的
3
3
3 位是不是都是 L
,如果是,返回 false;
(4)遍历结束,返回 true。
class Solution {
public:
bool checkRecord(string s) {
int cnt = 0;
for (int i = 0; i < s.size(); ++ i)
{
if (s[i] == 'A')
cnt ++;
if (cnt >= 2)
return false;
if (s[i] == 'L' && s[i + 1] == 'L' && s[i + 2] == 'L')
return false;
}
return true;
}
};
3、统计是给定字符串前缀的字符串数目
(1)遍历 words 数组,如果 s 长度相等的前缀
与 words 的字符串相等,那么计数
+
1
+1
+1,最后返回计数。
class Solution {
public:
int countPrefixes(vector<string>& words, string s) {
int res = 0;
for (int i = 0; i < words.size(); ++ i)
{
if (words[i] == s.substr(0, words[i].size()))
res ++;
}
return res;
}
};
4、字符串的最大公因子 O ( n ) O(n) O(n)
(1)首先,通过规律可知,如果 x 可以整除 str1 和 str2,那么 str1 和 str2 都是 x 的有限次拼接的;
(2)如果 str1 与 str2 正接与反接不相等,即 str1 + str2 != str2 + str1
,那么,返回""
;
(3)如果可以整除,首先通过
辗转相除法
\text{辗转相除法}
辗转相除法 求出 str1 和 str2 的长度的公约数,然后对其中一个求公约数长度的子字符串即为所求。
class Solution {
public:
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
string gcdOfStrings(string str1, string str2) {
if (str1 + str2 != str2 + str1)
return "";
int cnt = gcd(str1.size(), str2.size());
return str1.substr(0, cnt);
}
};