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
相关产品推荐
相关产品推荐

