如何在字符串中找到所有可能的子字符串?

如何在字符串中找到所有可能的子字符串?

问题描述:

我想什么做的是采取一个字符串,返回所有可能的子字符串比长度2.因此,使用welcome例如更大:如何在字符串中找到所有可能的子字符串?

we 
el 
lc 
co 
me 
wel 
elc 
lco 
com 
ome 
welc 
elco 
lcom 
come 
and so on..... 

我能想到的唯一办法做到这一点是这样的(没有经过测试):

for (int i = 0; i < word.Length; i++) //i is starting position 
{ 
    for (int j = 2; j + i < word.Length; j++) //j is number of characters to get 
    { 
     wordList.Add(word.SubString(i, j)); 
    } 
} 

但如果有更好的方法来做到这一点(使用LINQ可能)我​​不知道,我不知道?

+2

这就是我想要做的具体的方式。虽然,你会不会想启动我在零? – jahroy

+0

对于第一个循环来说就是这样。我必须测试以确定其余的,但我认为,因为我不想要1个字母的子字符串,我需要从2开始。 –

+3

定义“更好”:) – dzendras

这个怎么样一个简单的,可读的方法呢?

var text = "welcome"; 

var query = 
    from i in Enumerable.Range(0, text.Length) 
    from j in Enumerable.Range(0, text.Length - i + 1) 
    where j >= 2 
    select text.Substring(i, j); 

它产生:

we 
wel 
welc 
welco 
welcom 
welcome 
el 
elc 
elco 
elcom 
elcome 
lc 
lco 
lcom 
lcome 
co 
com 
come 
om 
ome 
me 
+0

如果你让第二个'.Range'从'2' – AakashM

+0

(或类似的东西)开始,你可以摆脱'where'的位置 – AakashM

+0

@AakashM - 我当然可以通过更改'where j> = 2'第二个'Range'是'Enumerable.Range(2,text.Length - i - 1)',但这使得这个查询的功能不太明显。它会缩短几次迭代,但它都在内存中,而且速度非常快。 – Enigmativity

这LINQ的解决方案应该工作:

var str = "welcome"; 
var items = Enumerable 
    .Range(0, str.Length) 
    .SelectMany(i => Enumerable.Range(2, str.Length-i-1).Select(j => str.Substring(i, j))) 
    .Distinct() 
    .OrderBy(s => s.Length); 
foreach (var s in items) { 
    Console.WriteLine(s); 
} 
+1

嗯..这是我发现基于循环的方法更清晰可读的地方:-)虽然Linq可能工作在这个问题中,它不像基于循环的方法那样可读(这是Linq的强项之一) – Hao

+1

@浩然绝对!对于这个简单的问题,LINQ解决方案仅仅是一种好奇 - 仅仅是为了表明LINQ足够强大。 – dasblinkenlight

的代码如下:

internal static List<string> GetAllSubstring(String mainString) 
    { 
     try 
     { 
      var stringList = new List<string>(); 
      if(!string.IsNullOrEmpty(mainString)) 
      { 
       for (int i = 0; i < mainString.Length; i++) //i is starting position 
       { 
        for (int j = 2; j + i < mainString.Length; j++) //j is number of characters to get 
        { 
         if(!stringList.Contains(mainString.Substring(i, j))) 
         { 
          stringList.Add(mainString.Substring(i, j)); 
         } 
        } 
       } 

      } 

      return stringList; 
     } 
     catch(Exception ex) 
     { 

     } 

     return null; 
    }