簡體   English   中英

更優化的解決方案,查找字符串中子字符串的數量。 使用C

[英]More optimized solution, find number of substrings in a string. Using C

因此,我有一個任務來查找給定字符串中的子字符串數。 我不能使用任何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:

到目前為止,沒有發現錯誤。

做了一些不同的字符串遍歷,現在我沒有在compare chars循環中遞增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;
}

感謝您的建議,Vitaly

擊敗它:(也適用於額外條件)

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

我建議以允許使用庫函數的方式編寫它。 然后返回並編寫您自己使用的那些庫函數的版本。 雖然編寫string.h函數的高度優化的版本可能很困難,但是用C編寫其中大多數函數的不錯的版本非常容易。

使用子例程(函數)執行此問題的子任務將有助於您保持代碼清晰,並避免某些類型的問題,例如,如果您調用了:

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

在“ aaaaa”中出現了4個字符串“ aa”,但是我認為您的函數不會找到所有這些。 這樣做的原因是,當您在較大的字符串中搜索第二秒的出現時,對於字符串的開頭和字符串內的字符串都使用相同的索引。 實際上,對於以下情況,您似乎會得到錯誤的結果:

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

當然,除非我誤解了該函數的功能。

如果您要編寫自己的字符串前綴比較函數版本(本質上是memcmpstrncmp ),那么您將使匹配字符串長度的工作從深入字符串中分離出來,並且可能不會犯這樣的錯誤。

如果您擔心會降低函數的效率以及調用函數的開銷,請不必擔心。 首先,還不錯。 其次,只需聲明它們為inlinestatic inline並且如果您啟用了優化功能進行編譯,則編譯器很可能會產生與不使用多個函數一樣好的代碼。

這感覺就像是一個作業問題-在這種情況下,您絕對應該自己做。 但是,您可能要檢查的東西是我認為您的代碼現在無法正確處理的是:

字符串“ bobobo”中出現“ bobo”多少次。 它可能應該是兩次,我認為原樣的代碼只會算一次。

馬克,祝你好運。

好吧,從算法的角度來看,這還不錯。 您可以進行優化,但我認為這不是重點(看起來像作業!)。

您可能會有一個小問題:在類似“ haha​​haha”的字符串中,應檢測多少次“ haha​​”? 兩次? 三次? 您的代碼將看到兩次。

從樣式的角度來看,當然還有改進的余地,但是隨着時間的流逝,您將通過編碼和閱讀其他人的代碼=)了解到這一點。 繼續吧!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM