【Leetcode -455.分发饼干 -459.重复的字符串】

简介: 【Leetcode -455.分发饼干 -459.重复的字符串】

Leetcode -455.分发饼干

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

示例 1 :

输入: g = [1, 2, 3], s = [1, 1]

输出 : 1

解释 :

你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1, 2, 3。

虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。

所以你应该输出1。

示例 2 :

输入: g = [1, 2], s = [1, 2, 3]

输出 : 2

解释 :

你有两个孩子和三块小饼干,2个孩子的胃口值分别是1, 2。

你拥有的饼干数量和尺寸都足以让所有孩子满足。

所以你应该输出2.

思路是先将两个数组从小到大排序,用两个指针 i 和 j 分别遍历两个数组;当s[j] 饼干的尺寸大于等于当前g[i]孩子的胃口时,i和j都往后走;否则,s[j] 小于g[i]时,j往后走,直到找到适合当前孩子的饼干尺寸;最终返回i;

int compare(void* p1, void* p2)
    {
        return *(int*)p1 - *(int*)p2;
    }
    int findContentChildren(int* g, int gSize, int* s, int sSize)
    {
        //给两个数组排序
        qsort(g, gSize, sizeof(g[0]), compare);
        qsort(s, sSize, sizeof(s[0]), compare);
        //i和j分别遍历孩子的胃口值和我有的饼干数量尺寸
        int i = 0, j = 0;
        //i和j都要小于数组长度
        while (i < gSize && j < sSize)
        {
            //当我的饼干尺寸小于孩子的胃口值,饼干的尺寸往后遍历,直到找到合适这个孩子的胃口的饼干
            //当我的饼干尺寸大于等于孩子的胃口值,i和j都往后遍历,判断下个孩子的胃口值
            //i统计的是当前胃口已经满的孩子,所以最终返回i即可
            if (s[j] >= g[i])
            {
                i++;
            }
            j++;
        }
        return i;
    }

Leetcode - 459.重复的字符串

题目:给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

示例 1:

输入: s = “abab”

输出 : true

解释 : 可由子串 “ab” 重复两次构成。

示例 2 :

输入 : s = “aba”

输出 : false

示例 3 :

输入 : s = “abcabcabcabc”

输出 : true

解释 : 可由子串 “abc” 重复四次构成。(或子串 “abcabc” 重复两次构成。)

思路是用两个指针 i 和 j ,i遍历一次,j会逐一判断i之前的元素是否相同,若不相同,则不是重复字符串,flag置0;若相同,则继续遍历,直到j遍历完;这一过程 i 就是在寻找开始重复字符串的开头,这样子 j 遍历 i 之前的元素就会每一个都相同,若不相同,则说明从 i 这个位置开始不能构成 s 的字串;

例如图,i 从下标为1开始,将 i 赋给 j ,判断 i 之前的元素是否可以构成 s 的字串,很明显从下标1开始不能构成;

i 从下标2开始,根据思路,i 之前的元素是可以构成 s 的字串的;

bool repeatedSubstringPattern(char* s)
    {
        //i找到开始重复字符串的开头,j开始遍历,逐一判断i之前的元素是否相同,
        //若不相同,则不是重复字符串,flag置0;若相同,则继续遍历,直到j遍历完,flag还没有置0,就返回true
        for (int i = 1; i <= strlen(s) / 2; i++)
        {
            //长度为奇数不可能有重复的字符串
            if (strlen(s) % i == 0)
            {
                //flag默认为1
                int flag = 1;
                for (int j = i; j < strlen(s); j++)
                {
                    if (s[j] != s[j - i])
                    {
                        flag = 0;
                        break;
                    }
                }
                if (flag)
                {
                    return true;
                }
            }
        }
        return false;
    }
目录
相关文章
|
28天前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
32 1
|
1月前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
24 9
|
1月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
17 0
|
1月前
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
28 0
|
1月前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
19 0
|
1月前
【LeetCode 19】541.反转字符串II
【LeetCode 19】541.反转字符串II
20 0
|
1月前
【LeetCode 18】6.2.反转字符串
【LeetCode 18】6.2.反转字符串
15 0
|
3月前
|
存储 算法
LeetCode第43题字符串相乘
LeetCode第43题"字符串相乘"的解题方法,通过使用数组存储乘积并处理进位,避免了字符串转换数字的复杂性,提高了算法效率。
LeetCode第43题字符串相乘
|
3月前
|
算法 Java
LeetCode第28题找出字符串中第一个匹配项的下标
这篇文章介绍了LeetCode第28题"找出字符串中第一个匹配项的下标"的两种解法:暴力解法和KMP算法,并解释了KMP算法通过构建前缀表来提高字符串搜索的效率。
LeetCode第28题找出字符串中第一个匹配项的下标
|
3月前
|
算法
LeetCode第8题字符串转换整数 (atoi)
该文章介绍了 LeetCode 第 8 题字符串转换整数 (atoi)的解法,需要对字符串进行格式解析与校验,去除前导空格和处理正负号,通过从高位到低位的计算方式将字符串转换为整数,并处理越界情况。同时总结了这几道题都需要对数字的表示有理解。
LeetCode第8题字符串转换整数 (atoi)