দ্রুততম কমন সাবসেক্সেন্স সন্ধানকারী


11

আপনার টাস্ক বিশ্লিষ্ট করা হল দীর্ঘতম প্রচলিত Subsequence সমস্যা জন্য n দৈর্ঘ্য 1000 এর স্ট্রিং।

জন্য দুই বা ততোধিক স্ট্রিং অবস্থায় LCS সমস্যার একটি বৈধ সমাধান এস 1 , ... এস এন কোনো স্ট্রিং টি সর্বোচ্চ দৈর্ঘ্য যেমন যে অক্ষর টি সব প্রদর্শিত S আমি হিসাবে, একই আদেশ টি

দ্রষ্টব্য যে T টি এস i এর একটি সাব স্ট্রিং হতে হবে না ।

আমরা ইতিমধ্যে সংক্ষিপ্ত পরিমাণ কোডে এই সমস্যাটি সমাধান করেছি । এইবার, আকার কোন ব্যাপার না।

উদাহরণ

স্ট্রিং axbyczএবং xaybzcদৈর্ঘ্য 3 8 সাধারণ subsequences আছে:

abc abz ayc ayz xbc xbz xyc xyz

এর যে কোনও একটি এলসিএস সমস্যার বৈধ সমাধান হতে পারে।

বিস্তারিত

উপরে উল্লিখিত বিধিগুলি অনুসরণ করে এলসিএস সমস্যা সমাধান করার জন্য একটি সম্পূর্ণ প্রোগ্রাম লিখুন:

  • ইনপুটটিতে 1000x দৈর্ঘ্যের দুটি বা ততোধিক স্ট্রিং থাকবে, 0x30 এবং 0x3F এর মধ্যে কোড পয়েন্ট সহ ASCII অক্ষর থাকবে।

  • আপনাকে এসটিডিআইএন থেকে ইনপুটটি পড়তে হবে।

    ইনপুট ফর্ম্যাটটির জন্য আপনার দুটি পছন্দ রয়েছে:

    • প্রতিটি স্ট্রিং (সর্বশেষ সহ) একটি লাইনফিড অনুসরণ করে।

    • স্ট্রিংগুলি কোনও বিভাজক এবং কোনও পেছনের লাইনফিডের সাথে এক সাথে বেঁধে রাখা হয়েছে।

  • আপনার প্রোগ্রামে কমান্ড-লাইন প্যারামিটার হিসাবে স্ট্রিংয়ের সংখ্যাটি পাস করা হবে।

  • আপনাকে আউটপুট লিখতে হবে, অর্থাত্, এলসিএসের বৈধ সমাধানগুলির মধ্যে একটিটি STDOUT এ, তারপরে একটি লাইনফিড লিখতে হবে।

  • আপনার পছন্দের ভাষাতে আমার অপারেটিং সিস্টেমের জন্য একটি ফ্রি (সংযোজন বিয়ারের মতো) সংকলক / দোভাষী দিতে হবে (ফেডোরা 21)

  • আপনার যদি কোনও সংকলক পতাকা বা নির্দিষ্ট দোভাষী প্রয়োজন হয়, দয়া করে এটি আপনার পোস্টে উল্লেখ করুন।

স্কোরিং

কোনও বৈধ সমাধান মুদ্রণ করতে 120 সেকেন্ডের বেশি সময় না লাগানো পর্যন্ত আমি 2, 3 ইত্যাদি স্ট্রিং সহ আপনার কোডটি চালাব। এর অর্থ হ'ল এন এর প্রতিটি মানের জন্য আপনার 120 সেকেন্ড রয়েছে ।

আপনার কোডটি সময়মতো শেষ হয়ে গেছে তার জন্য সর্বোচ্চ পরিমাণের স্ট্রিং।

এন এর স্কোর স্কোর হওয়ার ক্ষেত্রে, স্বল্পতম সময়ে এন স্ট্রিংগুলির জন্য সমস্যার সমাধান করা জমাটি বিজয়ী হিসাবে ঘোষণা করা হবে।

সমস্ত সাবমিশনগুলি আমার মেশিনে সময়সীমা নির্ধারণ করা হবে (ইন্টেল কোর i7-3770, 16 GiB র‌্যাম, কোনও স্ব্যাপ নেই)।

এন স্ট্রিং (ঢ -1) তম পরীক্ষা কল করে তৈরি করা হবে rand n(এবং linefeeds stripping যদি অনুরোধ), যেখানে randসংজ্ঞায়িত করা হয় নিম্নরূপ:

rand()
{
    head -c$[500*$1] /dev/zero |
    openssl enc -aes-128-ctr -K 0 -iv $1 |
    xxd -c500 -ps |
    tr 'a-f' ':-?'
}

কীটি 0উপরের কোডটিতে রয়েছে তবে আমি যদি আউটপুট (আংশিকভাবে) হার্ডকোডিংয়ের কাউকে সন্দেহ করি তবে আমি এটি একটি অজ্ঞাত মানতে পরিবর্তন করার অধিকার সংরক্ষণ করি।


আমরা কি ব্যতিক্রম ছুঁড়ে দিতে পারি?
হাইপার নিউট্রিনো

@ জেমসমিথ যতক্ষণ না আউটপুট সঠিক, নিশ্চিত।
ডেনিস

যেহেতু আমি বাফারড্রেডার দিয়ে পড়ছি, তাই আমি কী থেকে আইওক্সেপশনটি ফেলে দিতে পারি public static void main(...)?
হাইপারনিউট্রিনো

@ জেমস্মিথ আমি সত্যিই জাভা জানি না, তাই এটি কী তা আমি জানি না, তবে ব্যতিক্রমগুলি নিয়ে চিন্তা করবেন না।
ডেনিস

4
@ জেমস্মিথ যেহেতু কোড দৈর্ঘ্য এই চ্যালেঞ্জের জন্য গুরুত্বপূর্ণ নয়, আপনি কেবল ব্যতিক্রমগুলি ধরতে পারবেন না?
রেটো কোরাডি

উত্তর:


5

সি, এন = 3 ~ 7 সেকেন্ডে

অ্যালগরিদম

অ্যালগরিদম হল nক্রমগুলির স্ট্যান্ডার্ড ডায়নামিক প্রোগ্রামিং সমাধানের প্রত্যক্ষ সাধারণীকরণ । 2 টি স্ট্রিংয়ের জন্য Aএবং Bস্ট্যান্ডার্ড পুনরাবৃত্তিটি এটির মতো দেখাচ্ছে:

L(p, q) = 1 + L(p - 1, q - 1)           if A[p] == B[q]
        = max(L(p - 1, q), L(p, q - 1)) otherwise

3 স্ট্রিং জন্য A, B, Cআমি ব্যবহার করুন:

L(p, q, r) = 1 + L(p - 1, q - 1, r - 1)                          if A[p] == B[q] == C[r]
           = max(L(p - 1, q, r), L(p, q - 1, r), L(p, q, r - 1)) otherwise

কোডটি নির্বিচার মানগুলির জন্য এই যুক্তি প্রয়োগ করে n

দক্ষতা

আমার কোডের জটিলতা হ'ল sস্ট্রিংয়ের দৈর্ঘ্য সহ ও (গুলি) । আমি যা পেয়েছি তার ভিত্তিতে, দেখে মনে হচ্ছে সমস্যাটি এনপি-সম্পূর্ণ। সুতরাং যখন পোস্ট অ্যালগরিদম বৃহত্তর মানগুলির জন্য খুব অদক্ষ n, তবে এটি সম্ভবত বৃহত্তরতরূপে আরও ভাল করা সম্ভব নয়। আমি কেবলমাত্র কিছু জিনিস দেখেছি যা ছোট বর্ণমালার জন্য দক্ষতা উন্নত করে। যেহেতু বর্ণমালা এখানে মাঝারিভাবে ছোট (16), এটি উন্নতি করতে পারে lead আমি এখনও ভবিষ্যদ্বাণী করি যে n = 42 মিনিটের চেয়ে বেশি উচ্চতর বৈধ সমাধান কেউ পাবেন না এবং n = 4ইতিমধ্যে উচ্চাভিলাষী দেখছেন।

আমি প্রাথমিক প্রয়োগে মেমরির ব্যবহার হ্রাস করেছি, যাতে এটি n = 4পর্যাপ্ত সময় হ্যান্ডেল করতে পারে । তবে এটি কেবল সিকোয়েন্সের দৈর্ঘ্য তৈরি করেছিল, ক্রমটি নিজেই নয়। এই কোডটি দেখার জন্য এই পোস্টটির পুনর্বিবেচনার ইতিহাসটি দেখুন।

কোড

যেহেতু এন-ডাইমেনশনাল ম্যাট্রিকগুলিতে লুপগুলি স্থির লুপগুলির চেয়ে আরও যুক্তিযুক্ত প্রয়োজন, তাই আমি সর্বনিম্ন মাত্রার জন্য একটি নির্দিষ্ট লুপ ব্যবহার করছি এবং বাকি মাত্রাগুলির জন্য কেবল জেনেরিক লুপিং যুক্তি ব্যবহার করি।

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

#define N_MAX 4

int main(int argc, char* argv[]) {
    int nSeq = argc - 1;
    if (nSeq > N_MAX) {
        nSeq = N_MAX;
    }

    char** seqA = argv + 1;

    uint64_t totLen = 1;
    uint64_t lenA[N_MAX] = {0};
    uint64_t offsA[N_MAX] = {1};
    uint64_t offsSum = 0;
    uint64_t posA[N_MAX] = {0};

    for (int iSeq = 0; iSeq < nSeq; ++iSeq) {
        lenA[iSeq] = strlen(seqA[iSeq]);
        totLen *= lenA[iSeq] + 1;

        if (iSeq + 1 < nSeq) {
            offsA[iSeq + 1] = totLen;
        }

        offsSum += offsA[iSeq];
    }

    uint16_t* mat = calloc(totLen, 2);
    uint64_t idx = offsSum;

    for (;;) {
        for (uint64_t pos0 = 0; pos0 < lenA[0]; ++pos0) {
            char firstCh = seqA[0][pos0];
            int isSame = 1;
            uint16_t maxVal = mat[idx - 1];

            for (int iSeq = 1; iSeq < nSeq; ++iSeq) {
                char ch = seqA[iSeq][posA[iSeq]];
                isSame &= (ch == firstCh);

                uint16_t val = mat[idx - offsA[iSeq]];
                if (val > maxVal) {
                    maxVal = val;
                }
            }

            if (isSame) {
                mat[idx] = mat[idx - offsSum] + 1;
            } else {
                mat[idx] = maxVal;
            }

            ++idx;
        }

        idx -= lenA[0];

        int iSeq = 1;
        while (iSeq < nSeq && posA[iSeq] == lenA[iSeq] - 1) {
            posA[iSeq] = 0;
            idx -= (lenA[iSeq] - 1) * offsA[iSeq];
            ++iSeq;
        }
        if (iSeq == nSeq) {
            break;
        }

        ++posA[iSeq];
        idx += offsA[iSeq];
    }

    int score = mat[totLen - 1];

    char* resStr = malloc(score + 1);
    resStr[score] = '\0';

    for (int iSeq = 0; iSeq < nSeq; ++iSeq) {
        posA[iSeq] = lenA[iSeq] - 1;
    }

    idx = totLen - 1;
    int resIdx = score - 1;

    while (resIdx >= 0) {
        char firstCh = seqA[0][posA[0]];
        int isSame = 1;
        uint16_t maxVal = mat[idx - 1];
        int maxIdx = 0;

        for (int iSeq = 1; iSeq < nSeq; ++iSeq) {
            char ch = seqA[iSeq][posA[iSeq]];
            isSame &= (ch == firstCh);

            uint16_t val = mat[idx - offsA[iSeq]];
            if (val > maxVal) {
                maxVal = val;
                maxIdx = iSeq;
            }
        }

        if (isSame) {
            resStr[resIdx--] = firstCh;
            for (int iSeq = 0; iSeq < nSeq; ++iSeq) {
                --posA[iSeq];
            }
            idx -= offsSum;
        } else {
            --posA[maxIdx];
            idx -= offsA[maxIdx];
        }
    }

    free(mat);

    printf("score: %d\n", score);
    printf("%s\n", resStr);

    return 0;
}

চলমান জন্য নির্দেশাবলী

চালানোর জন্য:

  • একটি ফাইলে কোড সংরক্ষণ করুন, যেমন lcs.c
  • উচ্চতর অপ্টিমাইজেশন বিকল্পগুলির সাথে সংকলন করুন। আমি ব্যবহার করতাম:

    clang -O3 lcs.c
    

    লিনাক্সে, আমি চেষ্টা করব:

    gcc -Ofast lcs.c
    
  • কমান্ড লাইন আর্গুমেন্ট হিসাবে দেওয়া 2 থেকে 4 সিকোয়েন্স দিয়ে চালান:

    ./a.out axbycz xaybzc
    

    একক উদ্ধৃতি কমান্ড লাইন আর্গুমেন্ট প্রয়োজন হলে, উদাহরণস্বরূপ ব্যবহৃত বর্ণমালা শেল বিশেষ অক্ষর রয়েছে।

ফলাফল

test2.shএবং test3.shডেনিস থেকে পরীক্ষা ক্রম। আমি সঠিক ফলাফল জানি না, তবে আউটপুট কমপক্ষে প্রশ্রয়জনক দেখাচ্ছে।

$ ./a.out axbycz xaybzc
score: 3
abc

$ time ./test2.sh 
score: 391
16638018802020>3??3232270178;47240;24331395?<=;99=?;178675;866002==23?87?>978891>=9<6<9381992>>7030829?255>6804:=3>:;60<9384=081;0:?66=51?0;5090724<85?>>:2>7>3175?::<9199;5=0:494<5<:7100?=95<91>1887>33>67710==;48<<327::>?78>77<6:2:02:<7=5?:;>97<993;57=<<=:2=9:8=118563808=962473<::8<816<464<1==925<:5:22?>3;65=>=;27?7:5>==3=4>>5>:107:20575347>=48;<7971<<245<??219=3991=<96<??735698;62?<98928

real  0m0.012s
user  0m0.008s
sys   0m0.003s

$ time ./test3.sh 
score: 269
662:2=2::=6;738395=7:=179=96662649<<;?82?=668;2?603<74:6;2=04=>6;=6>=121>1>;3=22=3=3;=3344>0;5=7>>7:75238;559133;;392<69=<778>3?593?=>9799<1>79827??6145?7<>?389?8<;;133=505>2703>02?323>;693995:=0;;;064>62<0=<97536342603>;?92034<?7:=;2?054310176?=98;5437=;13898748==<<?4

real  0m7.218s
user  0m6.701s
sys   0m0.513s

দুঃখিতটি যদি তা পরিষ্কার না হয় তবে আপনার এলসিএস প্রিন্ট করতে হবে, কেবল তার দৈর্ঘ্য নয়।
ডেনিস

@ ডেনিস আমি দেখতে পাচ্ছি আমার কিছু অপ্টিমাইজেশন তখন বৃথা গিয়েছিল। আমাকে এমন একটি সংস্করণে ফিরে যেতে হবে যা পুরো ম্যাট্রিক্স সঞ্চয় করে যাতে আমি স্ট্রিংটির পুনর্গঠন করতে পারি। এটি এন = 4 এ চালাতে সক্ষম হবে না, তবে n = 3 এর জন্য 10 সেকেন্ডের নিচে শেষ হওয়া উচিত। আমার মনে হয় আমার যখন এখনও পুরো ম্যাট্রিক্স ছিল তখন আমি 6-7 সেকেন্ডের কাছাকাছি ছিলাম।
রেটো কোরাডি

আবার, দুঃখিত। এই সম্পর্কে প্রশ্নটি খুব পরিষ্কার ছিল না ... আপনি যখন নিজের আউটপুট পোস্ট করবেন, তখন আমি এটি ব্রেনস্টিলের সাথে তুলনা করতে সক্ষম হব। আপনার প্রোগ্রামের দৈর্ঘ্যটি তার আউটপুটটির দৈর্ঘ্য n = 2 এর জন্য 5 দ্বারা ছাড়িয়ে গেছে। যাইহোক, আমাকে জিসিসি সহ আপনার কোডটি সংকলন করতে আমাকে N_MAXম্যাক্রো হিসাবে সংজ্ঞায়িত করতে হয়েছিল এবং সংকলক পতাকাটি যুক্ত -std=c99করতে হয়েছিল।
ডেনিস

@ ডেনিস কোন সমস্যা নেই এটি বলেছিল যে সমাধানটি "একটি স্ট্রিং", সুতরাং এটি যথেষ্ট পরিমাণে পরিষ্কার হওয়া উচিত ছিল। আমি প্রায় একচেটিয়াভাবে সি ++ ব্যবহার করি, সুতরাং আমি কখনই নিশ্চিত নই যে সি-তে কী অনুমতি দেওয়া হয়েছে এই কোডটি সি ++ হিসাবে শুরু হয়েছিল তবে আমি একবার বুঝতে পেরেছিলাম যে আমি সত্যিই কোনও সি ++ বৈশিষ্ট্য ব্যবহার করছি না, আমি এটিকে সিটিতে স্যুইচ করেছি আমার ম্যাকের ঝনঝনিতে ng এতে সন্তুষ্ট ছিল তবে এটি সম্ভবত ডিফল্টরূপে একটি ভিন্ন সি সংস্করণ ব্যবহার করে বা আরও লেন্সেন্ট।
রেটো কোরাডি

1
@ ডেনিস ওকে, আমি ট্রেসব্যাক যুক্তি যুক্ত করেছি যাতে আমি স্ট্রিং উত্পাদন করতে পারি। এন = 3 এর জন্য এখন প্রায় 7 সেকেন্ড সময় নেয়।
রেটো কোরাদি

3

এই উত্তরটি বর্তমানে বাগের কারণে ভেঙে গেছে। শীঘ্রই স্থির করা হচ্ছে ...

সি, 2 স্ট্রিং ~ 35 সেকেন্ডে

এটি অনেকটা অগ্রগতিতে কাজ করছে (যেমনটি ভয়াবহ অগোছালোতার দ্বারা দেখানো হয়েছে), তবে আশা করি এটির কিছু ভাল উত্তর ছড়িয়ে পড়ে!

কোড:

#include "stdlib.h"
#include "string.h"
#include "stdio.h"
#include "time.h"

/* For the versatility */
#define MIN_CODEPOINT 0x30
#define MAX_CODEPOINT 0x3F
#define NUM_CODEPOINT (MAX_CODEPOINT - MIN_CODEPOINT + 1)
#define CTOI(c) (c - MIN_CODEPOINT)

#define SIZE_ARRAY(x) (sizeof(x) / sizeof(*x))

int LCS(char** str, int num);
int getshared(char** str, int num);
int strcount(char* str, char c);

int main(int argc, char** argv) {
    char** str = NULL;
    int num = 0;
    int need_free = 0;
    if (argc > 1) {
        str = &argv[1];
        num = argc - 1;
    }
    else {
        scanf(" %d", &num);
        str = malloc(sizeof(char*) * num);
        if (!str) {
            printf("Allocation error!\n");
            return 1;
        }

        int i;
        for (i = 0; i < num; i++) {
            /* No string will exceed 1000 characters */
            str[i] = malloc(1001);
            if (!str[i]) {
                printf("Allocation error!\n");
                return 1;
            }

            scanf(" %1000s", str[i]);

            str[i][1000] = '\0';
        }

        need_free = 1;
    }

    clock_t start = clock();

    /* The call to LCS */
    int size = LCS(str, num);

    double dt = ((double)(clock() - start)) / CLOCKS_PER_SEC;
    printf("Size: %d\n", size);
    printf("Elapsed time on LCS call: %lf s\n", dt);

    if (need_free) {
        int i;
        for (i = 0; i < num; i++) {
            free(str[i]);
        }
        free(str);
    }

    return 0;
}

/* Some terribly ugly global variables... */
int depth, maximum, mapsize, lenmap[999999][2];
char* (strmap[999999][20]);
char outputstr[1000];

/* Solves the LCS problem on num strings str of lengths len */
int LCS(char** str, int num) {
    /* Counting variables */
    int i, j;

    if (depth + getshared(str, num) <= maximum) {
        return 0;
    }

    char* replace[num];
    char match;
    char best_match = 0;
    int earliest_set = 0;
    int earliest[num];
    int all_late;
    int all_early;
    int future;
    int best_future = 0;
    int need_future = 1;

    for (j = 0; j < mapsize; j++) {
        for (i = 0; i < num; i++)
            if (str[i] != strmap[j][i])
                break;
        if (i == num) {
            best_match = lenmap[j][0];
            best_future = lenmap[j][1];
            need_future = 0;
            if (best_future + depth < maximum || !best_match)
                goto J;
            else {
                match = best_match;
                goto K;
            }
        }
    }

    for (match = MIN_CODEPOINT; need_future && match <= MAX_CODEPOINT; match++) {

    K:
        future = 1;
        all_late = earliest_set;
        all_early = 1;
        for (i = 0; i < num; replace[i++]++) {
            replace[i] = strchr(str[i], match);
            if (!replace[i]) {
                future = 0;
                break;
            }

            if (all_early && earliest_set && replace[i] - str[i] > earliest[i])
                all_early = 0;
            if (all_late && replace[i] - str[i] < earliest[i])
                all_late = 0;
        }
        if (all_late) {
            future = 0;
        }

    I:
        if (future) {
            if (all_early || !earliest_set) {
                for (i = 0; i < num; i++) {
                    earliest[i] = (int)(replace[i] - str[i]);
                }
            }

            /* The recursive bit */
            depth++;
            future += LCS(replace, num);
            depth--;

            best_future = future > best_future ? (best_match = match), future : best_future;
        }
    }

    if (need_future) {
        for (i = 0; i < num; i++)
            strmap[mapsize][i] = str[i];
        lenmap[mapsize][0] = best_match;
        lenmap[mapsize++][1] = best_future;
    }

J:
    if (depth + best_future >= maximum) {
        maximum = depth + best_future;
        outputstr[depth] = best_match;
    }

    if (!depth) {
        mapsize = 0;
        maximum = 0;
        puts(outputstr);
    }

    return best_future;
}

/* Return the number of characters total (not necessarily in order) that the strings all share */
int getshared(char** str, int num) {
    int c, i, tot = 0, min;
    for (c = MIN_CODEPOINT; c <= MAX_CODEPOINT; c++) {
        min = strcount(str[0], c);
        for (i = 1; i < num; i++) {
            int count = strcount(str[i], c);
            if (count < min) {
                min = count;
            }
        }
        tot += min;
    }

    return tot;
}

/* Count the number of occurrences of c in str */
int strcount(char* str, char c) {
    int tot = 0;
    while ((str = strchr(str, c))) {
        str++, tot++;
    }
    return tot;
}

প্রাসঙ্গিক ফাংশন যা সমস্ত এলসিএস গণনা সম্পাদন করে তা হ'ল ফাংশন LCS। উপরের কোডটি এই ফাংশনে তার নিজস্ব কল হবে।

হিসাবে সংরক্ষণ করুন main.cএবং এর সাথে সংকলন:gcc -Ofast main.c -o FLCS

কোডটি কমান্ড লাইন আর্গুমেন্ট বা স্টিডিনের মাধ্যমে চালানো যেতে পারে। স্টিডিন ব্যবহার করার সময়, এটি স্ট্রিংগুলি নিজেরাই অনুসরণ করে কয়েকটি স্ট্রিং প্রত্যাশা করে।

~ Me$ ./FLCS "12345" "23456"
2345
Size: 4
Elapsed time on LCS call: 0.000056 s

বা:

~ Me$ ./FLCS
6 
2341582491248123139182371298371239813
2348273123412983476192387461293472793
1234123948719873491234120348723412349
1234129388234888234812834881423412373
1111111112341234128469128377293477377
1234691237419274737912387476371777273
1241231212323
Size: 13
Elapsed time on LCS call: 0.001594 s

একটি ম্যাক ওএস এক্স বক্সে একটি 1.7 গিগাহার্টজ ইন্টেল কোর আই 7 এবং ডেনিস প্রদত্ত পরীক্ষার কেস সহ, আমরা দুটি স্ট্রিংয়ের জন্য নিম্নলিখিত আউটপুটটি পাই:

16638018800200>3??32322701784=4240;24331395?<;=99=?;178675;866002==23?87?>978891>=9<66=381992>>7030829?25265804:=3>:;60<9384=081;08?66=51?0;509072488>2>924>>>3175?::<9199;330:494<51:>748571?153994<45<??20>=3991=<962508?7<2382?489
Size: 386
Elapsed time on LCS call: 33.245087 s

পদ্ধতির আগের চ্যালেঞ্জ আমার পদ্ধতির অনুরূপ হয় এখানে । পূর্ববর্তী অপ্টিমাইজেশনের পাশাপাশি, আমরা এখন প্রতিটি পুনরাবৃত্তিতে স্ট্রিংগুলির মধ্যে মোট ভাগ করে নেওয়া অক্ষরের জন্য সন্ধান করি এবং যদি ইতিমধ্যে উপস্থিত থাকে তার চেয়ে দীর্ঘতর স্ট্রিংয়ের কোনও উপায় না থাকে তবে তাড়াতাড়ি প্রস্থান করি।

আপাতত, এটি 2 টি স্ট্রিং ঠিক আছে তবে আরও ক্র্যাশ-ওয়াই পেতে পারে। আরও উন্নতি এবং আরও ভাল ব্যাখ্যা আসতে হবে!


1
আমি মনে করি আমি কিছু মিস করেছি। 2 টি স্ট্রিং সহ এটি কি ক্লাসিক গতিশীল প্রোগ্রামিং সমস্যা নয় যা সমাধান করতে প্রায় 1000? 2 পদক্ষেপ নেওয়া উচিত? অন্য কথায়, একটি সেকেন্ডের ভগ্নাংশ।

@ ল্যাম্বিক হ্যাঁ, এটি করা উচিত। এই পদ্ধতিটি 2 টিরও বেশি স্ট্রিং পরিচালনা করার জন্য নির্মিত হয়েছিল, তবে এটির ভাল ফলাফল হওয়ার জন্য স্ট্রিং দৈর্ঘ্যের সাথে এটি খুব খারাপভাবে স্কেলিংয়ের সমাপ্তি ঘটল। আমি আমার হাতকে আরও অনেক কৌশল পেয়েছি এবং সেগুলির মধ্যে যদি আসলে কোন কিছু কাজ করে ... বিষয়গুলিতে অত্যন্ত উন্নতি করা উচিত।
মস্তিষ্কের স্টিল 21

কোথাও কোনও সমস্যা আছে বলে মনে হচ্ছে। @ রেটোকোরাদির কোডটি এন = 2 এর জন্য 391 দৈর্ঘ্যের একটি বৈধ সাধারণ স্ট্রিং খুঁজে পেয়েছে, যখন আপনার কোডটি 386 দৈর্ঘ্যের প্রতিবেদন করে এবং 229 দৈর্ঘ্যের একটি স্ট্রিং প্রিন্ট করে
ডেনিস

@ ডেনিস উম্ম ... হ্যাঁ, হ্যাঁ ... ওহ প্রিয়। ভালো, এটি অস্বস্তিকর. আমি এটিতে কাজ করছি :) আমি বাগটি প্রতিফলিত করার জন্য উত্তরটি সম্পাদনা করব।
ব্রেইনস্টিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.