最短的子序列

时间:2018-12-15 11:25:37

标签: algorithm dynamic-programming

给出两个字符串s和t,确定最短字符串z的长度,以使z是s的子序列,而不是t的子序列。

示例:

s:babab, t:babba

sol: 3 (aab)

不要查找可复制的代码,如果有人能帮助您解决此问题,请

非常感谢!

1 个答案:

答案 0 :(得分:0)

您在这里。我在IEnumarable方法上创建了方法,该方法可以返回所有可能的组合。将其与t进行比较。我对解决方案进行了优化,使其仅在不匹配的字符串t上循环一次。

using System;
using System.Collections.Generic;

namespace GuessTheNumber
{
    public class Element:IComparable<Element>
    {
        public string Seq { get; set; }
        public int Id { get; set; }

        public int CompareTo(Element other)
        {
            return this.Seq.CompareTo(other.Seq);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            string s = "babab";
            string t = "babba";
            string z = ShortestUncommonSuqsequence(s, t);
        }

        static public string ShortestUncommonSuqsequence(string SubSequenceOf, string NotSubSequenceOf)
        {
            var uniqueSeq = new SortedList<Element, int>();
            uniqueSeq.Add(new Element() { Seq = "", Id = -1 }, -1);

            foreach (Element oneSequence in GetNextUniqueSequences(uniqueSeq, SubSequenceOf))
            {
                int index = oneSequence.Id + 1;
                while (index < NotSubSequenceOf.Length)
                {
                    char NotChar = NotSubSequenceOf[index];
                    if (oneSequence.Seq[oneSequence.Seq.Length - 1] == NotChar) break;
                    index++;
                }
                if (index == NotSubSequenceOf.Length)
                {
                    return oneSequence.Seq;
                }
                else
                {
                    oneSequence.Id = index;
                }
            }
            return null;
        }

        static public IEnumerable<Element> GetNextUniqueSequences(SortedList<Element, int> UniqueSeq, string Input)
        {
            SortedList<Element, int> results = new SortedList<Element, int>();
            foreach (var prevResult in UniqueSeq)
            {
                for (int i = 0; i < Input.Length; i++)
                {
                    if (prevResult.Value < prevResult.Key.Seq.Length + i)
                    {
                        string nextStr = prevResult.Key.Seq + Input[i].ToString();
                        Element newElem = new Element() { Seq = nextStr, Id = prevResult.Key.Id };
                        if (!results.Keys.Contains(newElem))
                        {
                            results.Add(newElem, prevResult.Key.Seq.Length + i);
                            yield return newElem;

                        }
                    }
                }
            }

            if (Input.Length > 1)
            {
                foreach (Element res in GetNextUniqueSequences(results, Input.Substring(1)))
                {
                    yield return res;
                }
            }
        }
    }
}