六月集训代码打卡---DAY2

前言

        来自 英雄哪里出来 的一个 免费 集训,每天 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);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值