You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#代码优化:如何高效获取字符串的所有子串?

关于获取字符串所有子串的时间复杂度优化问题

嘿,我来帮你把这个问题掰明白~首先得给你浇个“冷水”:生成一个长度为n的字符串的所有子串,时间复杂度不可能低于O(n²),因为总共有n*(n+1)/2个子串(包括原字符串本身)——你总得把每个子串都生成出来吧?所以你现在的嵌套循环写法,时间复杂度已经是最优的了,没法再往下压了。

不过你的代码里有两个小问题可以先修正下:

  • 泛型声明写错了:new List<"string">()应该改成new List<string>()
  • 外层循环的条件length < mainString.Length会漏掉长度等于原字符串的那个子串,应该改成length <= mainString.Length

如果你是觉得嵌套循环不够优雅,想让代码更简洁易读,倒是可以用LINQ来重构,逻辑和原来的循环完全一致,时间复杂度还是O(n²):

var stringList = Enumerable.Range(1, mainString.Length)
    .SelectMany(length => Enumerable.Range(0, mainString.Length - length + 1)
        .Select(start => mainString.Substring(start, length)))
    .ToList();

另外,如果你的场景不需要一次性把所有子串都存进列表(比如只是需要逐个处理子串,不需要保留全部),那可以用迭代器模式优化空间复杂度——这样不需要一次性把所有子串加载到内存里,空间复杂度可以降到O(1)(只保存当前处理的子串):

public static IEnumerable<string> GetAllSubstrings(string mainString)
{
    for (int length = 1; length <= mainString.Length; length++)
    {
        for (int start = 0; start <= mainString.Length - length; start++)
        {
            yield return mainString.Substring(start, length);
        }
    }
}

调用的时候直接用foreach遍历就行:

foreach (var substring in GetAllSubstrings("yourString"))
{
    // 处理每个子串
}

总结一下:时间复杂度上已经没法再优化了,但可以根据你的实际需求优化代码的可读性或者空间利用率~

内容的提问来源于stack exchange,提问作者Praneet Nadkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:55:33