Задать вопрос
@akass
Developer

Простой геномный компилятор (анализ последовательностей)?

Есть последовательности символов , нужно собрать исходную последовательность,только если есть единственный вариант ,соединять последовательности можно только если они пересекаются хотя бы одним символом, например аббв и вццп можно соединить в аббвццп, вавв + вваб = вааб , подскажите как реализовать?
  • Вопрос задан
  • 2302 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
vipuhoff
@vipuhoff
Задача не является полной, потому как какая "искомая" последовательность будет зависить от порядка с которым будут браться фрагменты и нет гарантии того что в итоге не останутся "несовместимые фрагменты".
Если же в контексте задачи своеобразная "головоломка" имеющая только 1 решение, то придется произвести произвести полный перебор всех возможных решений, что потребует примерно N*(N^N) операций, то есть для всего 10 фрагментов будет примерно равно "пзц как много нулей сломался калькулятор", а если их 200....
Вывод задача не полна, для адекватности не хватает каких либо ограничителей.
Ответ написан
Neuroware
@Neuroware
Программист в свободное от работы время
Доработал v2
<code lang="cs">
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            List<string> coll = new List<string>();
            for (int i = 0; i < args.Length; i++)
            { coll.Add(args[i]); }
            Genome GG = new Genome();
            string s = GG.GetConcatGenom(coll);
            Console.WriteLine(s);
            Console.ReadKey();
            //GetConcatGenom(coll);

        }
    }
    public class Genome
    {
        public string GetConcatGenom(List<String> genoms)
        {
            List<string> sss = new List<string>();
            foreach (var item in genoms)
            {
                List<string> newgen = new List<string>(genoms);
                newgen.Remove(item);
                string curres = ConcatRecursive(item, newgen);
                sss.Add(curres);
                //Console.WriteLine(curres);
            }
            return "OK";
        }

        public string ConcatRecursive(string s, List<String> genoms)
        {

            
            if (genoms.Count == 0)
            {
                return s;
            }

            for (int j = 0; j < genoms.Count; j++)
            {
                List<String> gens = new List<String>(genoms);

                string newgen = s;
                //if (genoms.Count == 0) { return newgen ; }
                int minlen = Math.Min(genoms[j].Length, newgen.Length);
                bool finded = false;
                for (int i = minlen; i > 0; i--)
                {
                    if (finded )
                    {
                        break;
                    }
                    if (newgen.EndsWith(genoms[j].Substring(0, i)))
                    {
                        finded = true;
                        newgen = newgen.Substring(0, newgen.Length - i);
                        newgen += genoms[j];
                        gens.Remove(genoms[j]);
                        if (gens.Count == 0)
                        {
                            return newgen;
                        }
                        else
                        {
                            string curres = ConcatRecursive(newgen, gens);
                            if (curres != "")
                            {
                                Console.WriteLine(curres);
                                
                            }
                        }
                    }
                }

            }
            return "";
        }
    }
}
</code>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы