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开始不能构成;
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;
}