我希望这不是在回答家庭作业问题,但即使是这样,我想既然你已经有了一个可行的解决方案,我在技术上不会为他们做任何人的家庭作业。
我下面的两个解决方案都实现了原地崩溃算法,如果适用于该问题,这肯定是最有效的方法。如果问题需要崩溃到另一个缓冲区的解决方案,则所需的修改将是最小的。正如 Paul Griffiths 在他的解决方案中提到的,最有效的解决方案(对于大型干草堆)涉及预先计算针布尔值的查找表。我在mysqueeze3()
下面实现了这样的解决方案。请注意,如果要重复使用同一组针,最好将函数拆分为两个单独的函数,一个用于初始化针数组,然后mysqueeze
实现将采用指向针数组查找表的指针而不是指向字符串的指针。
在实施任何解决方案时,您都需要验证它是否正确处理重复的针字符。为了测试这一点,我将您的 haystack 字符串扩展为四个相同字母的序列。您原始帖子的解决方案正确处理了这种情况。我的两个解决方案也都能正确处理这种情况。
可能应该注意,虽然mysqueeze3()
比 更有效mysqueeze2()
,但前者不是通用解决方案,而后者是。查找表解决方案取决于char
大小为 8 位(或更小);即,最多有 256 个针值。如果char
系统上的 a 为 9 位或更大,则需要相应地修改该解决方案。如果char
您系统上的 a 是 16 位或更大(可能是 unicode!),那么查找表解决方案就变得不切实际了。
#include<stdio.h>
#include<string.h>
typedef enum {false=0, true=1} bool;
char *mysqueeze(char *a, char *b);
char *mysqueeze2(char *haystack, const char *needles);
char *mysqueeze3(char *haystack, const char *needles);
void mysqueeze_griffiths(const char * first, const char * second, char * result);
int main(void)
{
int j = 0;
char s1[100] = "kkkkrrrriiiisssshhhhnnnnaaaa";
char s2[100] = "kareem";
char real[100];
char *t = mysqueeze(s1,s2);
for (int i = 0; i <= strlen(t); i++) //1
if (t[i] != '*')
real[j++] = t[i];
real[j] = '\0'; //4
printf("mysqueeze: %s\n", real);
char s3[100] = "kkkkrrrriiiisssshhhhnnnnaaaa";
char s4[100] = "kareem";
printf("mysqueeze2: %s\n", mysqueeze2(s3,s4));
char s5[100] = "kkkkrrrriiiisssshhhhnnnnaaaa";
char s6[100] = "kareem";
printf("mysqueeze3: %s\n", mysqueeze3(s5,s6));
char s7[100] = "kkkkrrrriiiisssshhhhnnnnaaaa";
char s8[100] = "kareem";
char result[100];
mysqueeze_griffiths(s7,s8, result);
printf("mysqueeze_griffiths: %s\n", result);
}
char *mysqueeze(char *a, char *b)
{
int i = 0, k;
do
{
k = 0;
while (b[k] != '\0')
{
if (a[i] == b[k]) {
a[i] = '*';
break;
}
k++;
}
i++;
}
while (a[i]);
return a;
}
void mysqueeze_griffiths(const char * first, const char * second, char * result) {
while ( *first ) {
bool found = false;
while ( *second ) {
if ( *first == *second++ ) {
found = true;
break;
}
}
if ( !found ) {
*result++ = *first;
}
++first;
}
*result = '\0';
}
char *mysqueeze2(char *haystack, const char *needles)
{
char *dest=haystack, *src=haystack;
while (*src)
{
const char* n;
for (n=needles; *n; ++n)
{
if (*n==*src)
{
++src;
break;
}
}
if (!*n)
*dest++ = *src++;
}
*dest = '\0';
return haystack;
}
char *mysqueeze3(char *haystack, const char *needles)
{
char *dest=haystack, *src=haystack;
bool needleArray[256];
memset(needleArray,0,sizeof(needleArray));
for (const char* n=needles; *n; ++n)
needleArray[(unsigned char)*n] = true;
while (*src)
{
if (needleArray[(unsigned char)*src])
++src;
else
*dest++ = *src++;
}
*dest = '\0';
return haystack;
}