如何在字符串中找到所有可能的子字符串?
我想什么做的是采取一个字符串,返回所有可能的子字符串比长度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可能)我不知道,我不知道?
这个怎么样一个简单的,可读的方法呢?
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
如果你让第二个'.Range'从'2' – AakashM
(或类似的东西)开始,你可以摆脱'where'的位置 – AakashM
@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);
}
嗯..这是我发现基于循环的方法更清晰可读的地方:-)虽然Linq可能工作在这个问题中,它不像基于循环的方法那样可读(这是Linq的强项之一) – Hao
@浩然绝对!对于这个简单的问题,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;
}
这就是我想要做的具体的方式。虽然,你会不会想启动我在零? – jahroy
对于第一个循环来说就是这样。我必须测试以确定其余的,但我认为,因为我不想要1个字母的子字符串,我需要从2开始。 –
定义“更好”:) – dzendras