【问题标题】:More optimized solution, find number of substrings in a string. Using C更优化的解决方案,查找字符串中的子字符串数量。使用 C
【发布时间】:2011-04-27 03:09:25
【问题描述】:

所以,我的任务是在给定字符串中查找子字符串的数量。我不能使用任何 C 库来完成这项任务。 stringExist 只能有 2 个字符串作为参数。

我的解决方案正在运行,但我觉得应该有一种更优雅的方式来完成这项任务。 解决方案 1: 事实证明,它无法正常工作

#include <stdio.h>

int stringExist(char string[], char s2[]);

int main(void){
    char string[] = "strstrASDstrSTRst";
    char s2[] = "str";
    printf("Final result: %i\n",stringExist(string,s2));
    return 0;
}

int stringExist(char string[], char s2[]){
/* I am aware that I can init all this values in one row */
    int count = 0;
    int size = 0;
    int i = 0;
    int temp = 0;
    int result = 0;

    while(s2[size]!='\0'){        
        size++;
    }

    while(string[i]!='\0')
    {        
        if(string[i]==s2[0])
        {
            printf("Found first occurrence\n");
            count=0;            
            while((temp=(string[i]==s2[count]))!=0)
            {            
                count++;                    
                if(size==count){
                    printf("Match\n");
                    result++;                    
                    break;                    
                }
                i++;
            }
        }
        i++;
    }


    return result;
} 

解决方案 2:

目前没有发现错误。

做了一点不同的字符串遍历,现在我不在比较字符循环中增加 i。

#include <stdio.h>

int stringExist(char string[], char s2[]);

int main(void){
    char string[] = "bobobobojkhhkjjkhbo;klkl;bobo";
    char s2[] = "bobo";
    printf("Final result: %i\n",stringExist(string,s2));
    return 0;
}

int stringExist(char string[], char s2[]){
    int count = 0;
    int size = 0;
    int i = 0;
    int c = 0;
    int temp = 0;
    int result = 0;

    while(s2[size]!='\0'){      
        size++;
    }
    for(i=0;string[i]!='\0';i++){
        if(string[i]==s2[0])
        {
            printf("Found first occurence at %i\n",i);
            count = 0;
            c = i;              

                while((temp=(string[c]==s2[count]))!=0)
                {       
                    printf("Count %i, I %i, current char: %c\n",count, c,string[c]);
                    count++;                    
                    if(size==count){
                        printf("Match\n");
                        result++;                   
                        break;                  
                    }
                    c++;
                }

        }
    }


    return result;
}

感谢您的建议, 生命力

【问题讨论】:

  • 每次在 s1 中找到 s2 的第一个字符时,这将打印出“第一次出现”。
  • 您的功能不工作。试试 'char string[] = "strstrASDstrSTRststr";'答案应该是 4。
  • 谢谢 Dingo,我也发现了这个问题 =(...我想我在这里使用了错误的方法...呸,我没主意了。

标签: c string substring


【解决方案1】:

击败它:(也适用于额外条件)

int stringExist( char *string, char *sub )
{
  int count = 0;

  while( *string )
  {
    char *a = string, *b = sub;
    while( *a && *a == *b ) {a++;b++;}
    count += !*b;
    ++string;
  }

  return count;
}

【讨论】:

  • d'oh,抱歉,这里的 C 语言没有那么先进。系统管理员 =)
  • 好的,我明白了,这是一个令人印象深刻的解决方案。你是人类? =)
【解决方案2】:

我建议按照允许使用库函数的方式编写它。然后返回并编写您自己使用的那些库函数的版本。虽然编写高度优化的 string.h 函数版本可能很困难,但用 C 编写其中大部分函数的体面版本非常容易..

使用子例程(函数)来执行此问题的子任务将帮助您保持代码清晰并避免某些类型的问题,例如如果您调用了:

x = stringExist("aaaaa", "aa");

“aaaaa”中有 4 次出现字符串“aa”,但我认为您的函数不会找到所有这些。这样做的原因是,当您在较大的字符串中搜索第二个的出现时,您对字符串的开头和字符串内使用相同的索引。事实上,看起来你会得到错误的结果:

x = stringExist("tBatBath", "tBath");

当然,除非我误解了这个函数应该做什么。

如果您要编写自己版本的字符串前缀比较函数(基本上是memcmpstrncmp),那么您会将匹配字符串长度的工作与深入查看字符串分开,并且可能会没有犯过这样的错误。

如果您担心会降低函数的效率和调用函数的开销,请不要担心。首先,它并没有那么糟糕。其次,只需声明它们inlinestatic inline,如果您在打开优化的情况下进行编译,编译器很可能会生成与不使用多个函数时一样好的代码。

【讨论】:

    【解决方案3】:

    嗯,从算法的角度来看,这还不错。您可以进行优化,但我认为这不是重点(看起来像家庭作业!)。

    您可能有一个小问题:在像“hahahaha”这样的字符串中,应该检测到多少次“haha”?两次?三次?您的代码会看到它两次。

    从风格的角度来看,肯定有改进的余地,但随着时间的推移,你会从编码和阅读其他人的代码中了解到这一点 =)。坚持下去!

    【讨论】:

    • 是的,对我自己来说,这是一种家庭作业。你的测试用例刚刚打破了我的大脑。感谢您显示故障点,将进一步查看=)。
    【解决方案4】:

    这感觉像是一个家庭作业问题 - 在这种情况下,您绝对应该自己做。但是,您可能想要检查的我认为您的代码现在处理不正确的是:

    “bobo”在字符串“bobobo”中出现了多少次。它可能应该是两次,我认为您的代码只会计算一次。

    祝你好运, 标记。

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 2023-03-19
      • 2021-03-14
      • 1970-01-01
      • 2020-02-20
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多