在字符串中查找彼此相邻的单词

时间:2014-05-02 20:57:10

标签: c#

我需要能够找到不同数量的单词组合,其中单词在字符串中彼此相邻。

示例:

字符串:one two three four

我需要找到这样的组合:

one two
two three
three four
one two three
two three four

组合可能会变大,具体取决于字符串中的单词数量。 我很挣扎,因为最初的字符串可以是任意数量的单词。

修改

这段代码甚至不是很接近,但我正在努力克服这一切的逻辑。我的下面的代码做出了我不知道的假设。

string[] inputs = input.Replace("/", "").Split('-');
            List<string> returnList = new List<string>();
            for (int i = 0; i <= inputs.Length; i++ )
            {
                returnList.Add(inputs[i]);
                if (i > 0)
                {
                    returnList.Add(inputs[i - 1] + " " + inputs[i] + " " + inputs[i + 1]);
                }
            }

2 个答案:

答案 0 :(得分:2)

这是一个C#解决方案,它使用了一些LINQ ...

    static void Main(string[] args)
    {
        const string startingString = "one two three four";
        List<string> l = startingString.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries).ToList();
        var combinations = l.Select(q => FindPairs(q, l))
                   .ToList()
                   .SelectMany(r => r);
        foreach (var combination in combinations)
        {
            Console.WriteLine(String.Join(",", combination));
        }
    }
    private static List<List<string>> FindPairs(string s, List<string> list)
    {
        List<List<string> > result = new List<List<string>>();
        int index = list.IndexOf(s);
        for (int t = 2; t < list.Count; t++)
        {
            if (index + t <= list.Count)
            {
                var words = list.Skip(index).Take(t).ToList();
                if (words.Count() >= 2)
                {
                    result.Add(words);
                }
            }
        }
        return result;
    }

它产生结果......

one,two
one,two,three
two,three
two,three,four
three,four

与您的问题中的结果相匹配。解决方案的关键是结合Take和Skip运算符。 LINQ的SelectMany将列表列表展平为一个列表。

答案 1 :(得分:-1)

您可以首先在源字符串上调用String.Split函数,使用&#34; &#34; (或其他空格)作为分隔符。这将为您提供一个字符串数组,其中每个元素都是一个单词。之后,使用嵌套循环来构建每个字符串,如下面的代码所示:

private static List<string> GetStringCombos(string sourceString) { string[] sourceArray = sourceString.Split(' '); var newStrings = new List<string>(); for (int startIndex = 0; startIndex < sourceArray.Length; startIndex++) { for (int endIndex = startIndex; endIndex < sourceArray.Length; endIndex++) { string newString = ""; for (int currentIndex = startIndex; currentIndex <= endIndex; currentIndex++) { newString = string.Join(" ", newString, sourceArray[currentIndex]); } newStrings.Add(newString.Trim()); } } return newStrings; }