[英]input three strings into function, function needs to return the longest substring that is in all three strings
代碼我已經寫好了,差不多完成了,但是在測試的時候,有時會報錯(很少),我也不太明白為什么。(輸入三個字符串到function,function需要返回最長的substring在所有三個字符串中)。
char* findSubstring(char* string1, char* string2, char* string3) {
int pointer = 0;
int length = 1;
char *temp1;
char* temp2;
for (int i = 0; string1[i]; i++) {
for (int j = 0; string2[j]; j++) {
for (int k = 0; string3[k]; k++) {
if (string1[i] == string2[j] && string3[k] == string1[i]) {
if (strspn(&string1[i], string2) > length && strspn(&string1[i], string2) == strspn(&string2[j], string3)) {
length = strspn(&string1[i], strinh2);
pointer = i;
}
}
}
}
}
temp1 = (char*)malloc(length * sizeof(char) + 1);
for (int i = 0; i < length; i++) {
temp1[i] = string1[pointer + i];
}
temp1[length] = '\0';
return temp1;
}
所以這是 function,它在大部分時間都有效,但它只是隨機拋出一些與預期結果相差甚遠的東西。因此,如果有人能看到我可以改進的地方,我將不勝感激。
代碼不起作用的示例:
輸入:
string1: isdbhfjdfklekrumpirisbgozuesbgbzu
字符串 2:rgekrumpirasz954ho8g
string3: juidfg7808h5840870ghghkrumpirizg78jue56780jgeo8579h9krumpir
預期結果是“krumpir”,我得到“是”。
兩個明顯的問題:
strspn 對此是錯誤的——它找到了它的第一個參數的前綴,該前綴由第二個參數中任何地方的字符組成。 所以strspn("abcd", "ecab") == 3
即使字符串完全不同。 您需要編寫一個最長的前綴匹配 function(它在 stdlib 中不存在。)類似於:
int prefix_match(const char *a, const char *b) { int i = 0; while (a[i] && a[i] == b[i]) ++i; return i; }
將 string1 與 string2 和 string3 進行比較時,您需要匹配的長度相同,但您應該考慮兩個匹配長度中的最小值。 這會導致您無法匹配krumpir
(您的預期結果),因為 string1 和 string3 都包含krumpiri
但 string2 不包含。
結合這些,你最終會得到一個像這樣的循環
for (int i = 0; string1[i]; ++i)
for (int j = 0; string2[j]; ++j)
for (int k = 0; string3[k]; ++k) {
int l2 = prefix_match(&string1[i], &string2[j]);
int l3 = prefix_match(&string1[i], &string3[k]);
if (min(l2, l3) > length) {
length = min(l2, l3);
pointer = i; } }
這可以更好地優化(例如,將l2
提升到最內層循環之外並在l2 <= length
時完全跳過它),但應該可以工作。
由於傳遞的字符串在 function 中未更改,因此 function 參數應使用限定符const
定義,例如
char * findSubstring( const char *s1, const char *s2, const char *s3 );
至於你的代碼,那么 function strspn
並沒有按照你的想法去做。 根據 C 標准(7.23.5.6 的 strspn 函數)
2 strspn function 計算 s1 指向的字符串的最大初始段的長度,該字符串完全由 s2 指向的字符串中的字符組成。
這意味着例如如果你打電話
strspn( "ababccab", "cba" );
那么 function 將返回第一個字符串的長度,盡管第一個字符串不等於第二個字符串。
使用帶有嵌套 for 循環的方法可以定義 function,例如下面的演示程序中所示的以下方式。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * findSubstring( const char *s1, const char *s2, const char *s3 )
{
size_t length = 0;
size_t pos = 0;
size_t n1 = strlen( s1 );
size_t n2 = strlen( s2 );
size_t n3 = strlen( s3 );
for (size_t i = 0; i + length < n1; ++i)
{
int found = 1;
for (const char *p2 = s2;
found && ( p2 = strchr( p2, s1[i] ) ) != NULL && p2 - s2 < n2 - length;
++p2)
{
for (const char *p3 = s3;
found = ( p3 = strchr( p3, s1[i] ) ) != NULL && p3 - s3 < n3 - length;
++p3)
{
size_t n = 1;
while (s1[i + n] == p2[n] && p2[n] == p3[n]) ++n;
if (length < n)
{
length = n;
pos = i;
}
}
}
}
char *result = malloc( length + 1 );
if ( result != NULL )
{
for ( size_t i = 0; i < length; i++)
{
result[i] = s1[pos + i];
}
result[length] = '\0';
}
return result;
}
int main( void )
{
const char *s1 = "isdbhfjdfklekrumpirisbgozuesbgbzu";
const char *s2 = "rgekrumpirasz954ho8g";
const char *s3 = "juidfg7808h5840870ghghkrumpirizg78jue56780jgeo8579h9krumpir";
char *s = findSubstring( s1, s2, s3 );
if ( s != NULL ) puts( s );
free( s );
return 0;
}
程序 output 是
krumpir
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.