2016-07-02 3 views
0

2つの文字列の間の最大の重なりを見つけようとしています。新しい文字列に重複した文字を1回だけ印刷します(文字列の組み合わせ)

#include<stdio.h> 
#include<string.h> 
int main(void) 
{ 
    char string1[64],string2[64]; 
    char s3[128]; 
    int len=0; 

    printf("Enter string1"); 
    scanf("%s",string1); 
    printf("Enter string2"); 
    scanf("%s",string2); 
    for (char* s1 = string1; *s1 != '\0'; ++s1) 
    { 
     int overlap = 0; 
     for (char* s2 = string2; *s2 != '\0'; ++s2) 
     { 
      while (s1[overlap] != '\0' && s1[overlap] == s2[overlap]) 
      { 
       ++overlap; 
      } 
      if (len < overlap) 
      { 
       len = overlap; 
      } 
     } 
     s3[overlap]=string1[overlap]; 
    } 
    printf("%d\n",len); 
    printf("%s\n",s3); 
    printf(strcat(string1,string2)); 
    return 0; 
} 

私は最大オーバーラップオーバーラップでそれらの文字を発見したが、私は私の答えを得るために2列の組み合わせから重複を減算する方法がわからないです。例:a123とa123457は私に4とa123457を与えます(a123は1回しか出現しません)。

答えて

0

これは、私が予想していた以上に多くの呼びかけを受けました。彼らは直接、二つの文字列の間で比較することができるので、私は、整数インデックスにあなたのポインタになっそれから私は、各文字列で最長のオーバーラップの開始を追跡するための変数を追加(新しい文字列を構築するために必要な。):

#include <stdio.h> 
#include <string.h> 

#define MAX_STR_LEN (64) 

int main(void) { 
    char string1[MAX_STR_LEN], string2[MAX_STR_LEN], string3[MAX_STR_LEN * 2 - 1]; 
    int longest_overlap = 0, overlap_offset_s1 = -1, overlap_offset_s2 = -1; 

    printf("Enter string1: "); 
    scanf("%s", string1); 

    printf("Enter string2: "); 
    scanf("%s", string2); 

    int s1_len = strlen(string1), s2_len = strlen(string2); 

    for (int s1 = 0; s1 < s1_len; s1++) 
    { 
     for (int s2 = 0; s2 < s2_len; s2++) 
     { 
      int overlap = 0; 

      while (s1 + overlap < s1_len && s2 + overlap < s2_len && string1[s1 + overlap] == string2[s2 + overlap]) 
      { 
       ++overlap; 
      } 

      if (longest_overlap < overlap) 
      { 
       longest_overlap = overlap; 
       overlap_offset_s1 = s1; 
       overlap_offset_s2 = s2; 
      } 
     } 
    } 

    printf("%d\n", longest_overlap); 

    strncpy(string3, &string1[overlap_offset_s1], longest_overlap); 
    string3[longest_overlap] = '\0'; 

    printf("%s\n", string3); 

    if (longest_overlap == 0) 
    { 
     strcat(strcpy(string3, string1), string2); 
    } 
    else if (overlap_offset_s1 > overlap_offset_s2 || (overlap_offset_s1 == overlap_offset_s2 && s1_len < s2_len)) 
    { 
     strcpy(string3, string1); 
     string3[overlap_offset_s1] = '\0'; 
     strcat(string3, &string2[overlap_offset_s2]); 
    } 
    else 
    { 
     strcpy(string3, string2); 
     string3[overlap_offset_s2] = '\0'; 
     strcat(string3, &string1[overlap_offset_s1]); 

    } 

    printf("%s\n", string3); 

    return 0; 
} 

実施例

> ./a.out 
Enter string1: a123 
Enter string2: a123457 
4 
a123 
a123457 
> 
> ./a.out 
Enter string1: abcdef 
Enter string2: cdefgh 
4 
cdef 
abcdefgh 
> 

> ./a.out 
Enter string1: cdefgh 
Enter string2: abcdef 
4 
cdef 
abcdefgh 
> 

さらなる例

> ./a.out 
Enter string1: abc 
Enter string2: 123 
0 

abc123 
> 
+0

コードされますうまく動作しますが、それは私にすべての文字を与えるわけではありません。例:abcdと123を入力すると、0とabcd123cが返されますが、結果として123が返されます。 – Harry

+0

@ハリー "重複しない"状況はまっすぐで、私はそれを処理するために自分のコードを修正しました。しかし、それが何をすべきかは、仲裁とアプリケーションまでです。私は2つの文字列を等価として処理していたので、逆の順序でテストしましたが、「重複しない」場合は明白な出力はありませんが、アプリケーションでstring1優先順位が与えられていれば私が実装したソリューションです。 – cdlane

関連する問題