问题描述:
给出一个长串和短串,都是由普通字符组成的。要求检测短串中的所有字符是否都出现在长串中,如果是短串中重复出现某个字符,则长串中也必须出现相应次数的这个字符(次数大于等于短串种的次数)。
解题思路:
遍历短串,统计每个字符出现的次数,记录在一个bitmap数组中,因为字符的数值范围有限,所以我们的bitmap数组长度只需要128或256。
然后遍历长串,和bitmap中相应的记录对比,如果bitmap中记录的所有字符和次数都出现过了,就结束。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CHAR_VALUE (128)
static int FindSubStrInLargeStr(const char *Lstr, const char *Sstr)
{
int bitmap[MAX_CHAR_VALUE];
int idx, sum;
const char *p;
sum = 0;
memset(bitmap, 0, sizeof(int)*MAX_CHAR_VALUE);
p = Sstr;
while(*p)
{
idx = *p++;
if(idx>0 && idx<MAX_CHAR_VALUE)
{
sum++;
bitmap[idx]++;
}
}
p = Lstr;
while(*p)
{
idx = *p++;
if(idx>0 && idx<MAX_CHAR_VALUE && bitmap[idx]>0)
{
sum--;
bitmap[idx]--;
if(sum == 0)
{
printf("found\n");
return 1;
}
}
}
printf("not found\n");
return 0;
}
int main()
{
FindSubStrInLargeStr("lfsowdqiubeuwraoinvjnkcwjaoirunsajnfkdsajfjcs", "aabcc");
return 0;
}