【问题标题】:find the two longest word made of other words找到由其他单词组成的两个最长的单词
【发布时间】:2016-12-02 04:17:12
【问题描述】:

我想从数组中找到两个最长的单词,由较小的单词组成。我的代码如下。

目前的输出是:

catxdogcatsrat、ratcatdogcat、catsdogcats、dogcatsdog

要求的输出是:

老鼠猫,猫狗

class program 
{
    public static void Main(String[] args)
    {

        List<string> list2 = new List<string>();
        string[] stringrray =   { "cat", "cats", "catsdogcats", "catxdogcatsrat", "dog", "dogcatsdog",
                                 "hippopotamuses", "rat", "ratcatdogcat" };

        list2.Add(stringrray[0]);
        list2.Add(stringrray[1]);
        list2.Add(stringrray[2]);
        list2.Add(stringrray[3]);
        list2.Add(stringrray[4]);
        list2.Add(stringrray[5]);
        list2.Add(stringrray[6]);
        list2.Add(stringrray[7]);
        list2.Add(stringrray[8]);
        List<string> list = new List<string>();
        var mod = list2.OrderByDescending(x => x.Length).ToList();
        int j = 1;
        for (int k = 0; k < mod.Count; k++)
        {
            for (int i = 0; i < mod.Count-j; i++)
            {
                if (mod[i].Contains(mod[mod.Count - j]))
                {
                    j++;
                    list.Add(mod[i]);
                }
            }
        }
        var mod1 = list.OrderByDescending(x => x.Length);
        foreach (var i in mod1)
        {
            Console.WriteLine(i);
        }
        Console.ReadLine();
    }
}

【问题讨论】:

  • ratcatdogcat 不是一个有效的词吗?

标签: c# asp.net oop


【解决方案1】:

我认为您正在寻找类似的东西

string[] stringrray = { "cat", "cats", "catsdogcats", "catxdogcatsrat", "dog", "dogcatsdog", "hippopotamuses", "rat", "ratcatdogcat" };
List<string> list2 = new List<string>(stringrray);
List<string> Finallist = new List<string>();
char[] smallstrchar = String.Join("", list2.Where(x => x.Length <= 4)).ToCharArray();
char[] bigstrchar = String.Join("", list2.Where(x => x.Length > 4)).ToCharArray();
char[] modchar = bigstrchar.Except(smallstrchar).ToArray();

foreach(string bigstr in list2)
{
    if(!(bigstr.IndexOfAny(modchar) != -1))
    {
        Finallist.Add(bigstr);
    }
}
Finallist = Finallist.OrderByDescending(x => x.Length).Take(2).ToList();
foreach(string finalstr in Finallist)
{
    Console.WriteLine(finalstr);
}

首先是stringrray,它包含所有应该注意的字符串,并从中找到最长的字符串。使用您的代码,它还采用其中包含 x 的字符串,但所有其他字符都匹配。所以我在list2 中创建了一个字符串列表,其中包含所有值。然后将list2分成两部分,即smallstrchar数组包含小于4长度的较小字符串的所有字符,Bigstrchar包含所有大于5长度的字符串字符。现在Except取出所有smallstrchar 中不存在而 Bigstrchar 中存在的字符。现在我们有了需要从排序中排除的字符列表。

最后IndexOfAny 在那个字符串中查找是否包含那个字符。如果没有,则添加到 Finallist。稍后我们可以从列表中取出 2 个。

希望对你有帮助

【讨论】:

  • 其实 catxdogcatsrat 不是由其他更小的词组成的词。因为它包含 x 这不是一个词所以我想从输出中删除 catxdogcatsrat
  • 这意味着你的第一个循环没有找到正确的值
  • 我有另一个程序,但它只找到一个值。
  • codereview.stackexchange.com/questions/33266/… 。请参考这个链接它只找到一个最长的值我需要两个最长的值
  • 我们可以去掉对 min 的依赖吗?和最大长度。
【解决方案2】:

您可以简化将数组添加到 list2 的过程

list2.AddRange(stringrray)

【讨论】:

  • 是的,这是在列表中分配数组的正确方法,但输出没有变化。
【解决方案3】:

您可以使用此代码...

static void Main(string[] args)
{
    List<string> words = new List<string>() { "cat", "cats", "catsdogcats", "catxdogcatsrat", "dog", "dogcatsdog", "hippopotamuses", "rat", "ratcatdogcat" };
    List<string> result = new List<string>();
    // solution 1
    foreach (string word in words)
    {
        if (IsCombinationOf(word, words))
        {
            result.Add(word);
        }
    }

    // solution 2
    result = words.Where(x => IsCombinationOf(x, words)).ToList();
}

public static bool IsCombinationOf(string word, List<string> parts)
{
    // removing the actual word just to be secure.
    parts = parts.Where(x => x != word).OrderByDescending(x => x.Length).ToList();

    // erase each part in word. Only those which are not in the list will remain.
    foreach (string part in parts)
    {
        word = Regex.Replace(word, part, "");
    }

    // if there are any caracters left, it hasn't been a combination
    return word.Length == 0;
}

但是...

这段代码有一个小错误。 OrderbyDescending 子句确保cats 将在cat 之前被删除。否则s 将保留,代码将无法按预期工作。但是如果我们使用一些虚构的值,这段代码将无法正常工作。例如:

List<string> words = new List<string>() { "abz", "e", "zefg", "f", "g", "abzefg" };

让我们看看abzef。该算法将首先删除zefg,但随后就不可能再继续下去了。事实上,这个词是abzefg 的组合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2015-11-19
    相关资源
    最近更新 更多