[英]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");
當然,除非我誤解了該函數的功能。
如果您要編寫自己的字符串前綴比較函數版本(本質上是memcmp
或strncmp
),那么您將使匹配字符串長度的工作從深入字符串中分離出來,並且可能不會犯這樣的錯誤。
如果您擔心會降低函數的效率以及調用函數的開銷,請不必擔心。 首先,還不錯。 其次,只需聲明它們為inline
或static inline
並且如果您啟用了優化功能進行編譯,則編譯器很可能會產生與不使用多個函數一樣好的代碼。
這感覺就像是一個作業問題-在這種情況下,您絕對應該自己做。 但是,您可能要檢查的東西是我認為您的代碼現在無法正確處理的是:
字符串“ bobobo”中出現“ bobo”多少次。 它可能應該是兩次,我認為原樣的代碼只會算一次。
馬克,祝你好運。
好吧,從算法的角度來看,這還不錯。 您可以進行優化,但我認為這不是重點(看起來像作業!)。
您可能會有一個小問題:在類似“ hahahaha”的字符串中,應檢測多少次“ haha”? 兩次? 三次? 您的代碼將看到兩次。
從樣式的角度來看,當然還有改進的余地,但是隨着時間的流逝,您將通過編碼和閱讀其他人的代碼=)了解到這一點。 繼續吧!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.