c# - 是否存在用于从包含给定字符集和计数的输入字符串中查找最小子字符串的 O(n) 算法?

标签 c# string algorithm time-complexity

给定一个字符串 s 和一组带计数的字符,找到 s 中包含所有重复其计数次数的字符的最小子字符串。

示例:

charcount = { { 'A', 3 }, { 'B', 1 } }; 
str = "kjhdfsbabasdadaaaaasdkaaajbajerhhayeom" 

---> "aajba" 

我知道如何在 O(n^2) 时间内通过从最小到最大迭代所有子字符串来完成此操作。

可能的函数签名:

string SmallestSubstringWithCharacterCount(Dictionary<char,int> chardic, string source)
{
   // ... 
}

我猜你可以通过某种方式遍历 str 因为一旦你到达

"kjhdfsbabasdadaaaaasdkaaajbajerhhayeom" 
             |
           here

您找到了第一个字符串 "kjhdfsbabasda",其中包含集合中的所有字符。

最佳答案

是的,线性算法确实存在。

您需要使用初始零计数和 GoodCount 计数器设置额外的 currentcharcount。

制作两个索引指针 - 左和右,并通过输入字符串移动它们。

如果下一个字符来自集合,则在当前字符计数中增加此字符的计数。如果此计数等于目标值,则增加 GoodCount。 向右移动索引,直到 GoodCount 达到字符计数长度 - 现在当前子字符串包含所有需要的字符。

然后向左移动索引,递减计数,并在需要时递减 GoodCount。就在这一步之前,我们有从这里开始的最短子串。

递减 GoodCount 后 - 使用正确的索引重复过程等,以从所有最短的子串中选择最好的。

关于c# - 是否存在用于从包含给定字符集和计数的输入字符串中查找最小子字符串的 O(n) 算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38910989/

相关文章:

c# - 在 MVC3 应用程序的编辑操作方法中使用 AutoMapper

c# - GenericADOException 未处理无法插入

ios - 应该相等的字符串比较不相等

mysql - 计算每个条目的 LIKE 匹配数

algorithm - 如何计算具有 N 个元素的数组的 M 个元素的最大乘积

c# - 在 asp.net(C#) 的 DataGrid 中通过超链接传递动态参数

c# - 删除标题中的空格(头部)

java - String vs Char Array vs String Builder(效率表现)

java - 如何求dfs+回溯算法的时间复杂度?

python - 计算两个列表的相似度