2014-05-02 41 views
0

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

例子:

字符串: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

您是否要求一种方法来检查一组特定的单词是否确实在字符串中相互紧挨着出现(这是一个简单的检查),还是试图构建一个包含相邻单词的每种可能组合的字符串数组源字符串? – Jargon

+0

我想要你的第二个建议。 '建立一个包含源字符串中相邻单词的每个可能组合的字符串数组' – mdance

回答

1

这是使用一个比特LINQ的C#溶液...

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

你可以通过调用源字符串的String.Split函数来开始,使用“”(或其他空格)作为分隔符。这会得到一个字符串数组,其中每个元素都是一个单词。在此之后,使用嵌套循环来构建每个串,如在下面的代码:

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; }

+0

如果你期望有大的组合(即一个长输入字符串),你应该在嵌套循环中使用一个StringBuilder – Jargon

+0

这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 –