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

Leetcode

  • Leetcode -455.分发饼干
  • Leetcode - 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开始不能构成;

【Leetcode -455.分发饼干 -459.重复的字符串】_第1张图片

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

【Leetcode -455.分发饼干 -459.重复的字符串】_第2张图片

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

你可能感兴趣的:(leetcode,算法,c语言)