簡體   English   中英

輸入三個字符串到function,function需要返回所有三個字符串中最長的substring

[英]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.

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