以以下字符串为例:
“敏捷的棕色狐狸”
现在,quick中的q位于字符串的索引4(从0开始),而fox中的f位于索引16。现在假设用户在该字符串中输入了更多文本。
“速度非常快的深褐色狐狸”
现在q在索引9,f在索引26。
无论用户添加多少个字符,跟踪quick中的原始q和fox中的f的索引的最有效方法是什么?
语言对我来说无关紧要,这更多的是一个理论问题,而不是任何东西,所以使用任何你想要的语言,只要尽量保持它一般流行和当前的语言即可。
我给出的示例字符串很短,但我希望有一种方法可以有效地处理任何大小的字符串。因此,使用偏移量更新数组可以使用较短的字符串,但会因为很多字符而停滞不前。
即使在本例中,我在寻找字符串中唯一字符的索引,我也希望能够跟踪同一字符在不同位置的索引,比如brown中的o和fox中的o。所以搜索是不可能的。
我希望答案既节省时间又节省内存,但如果必须选择一个,我更关心性能和速度。
发布于 2008-08-30 08:51:05
您的问题有点模棱两可--您是否希望跟踪每个字母的第一个实例?如果是这样,长度为26的数组可能是最好的选择。
无论何时在低于索引位置的字符串中插入文本,只需根据插入字符串的长度计算偏移量即可。
发布于 2008-08-30 09:25:15
如果你已经有了目标语言,这也会有所帮助,因为并不是所有的数据结构和交互在所有语言中都是同样有效的。
发布于 2008-10-07 01:49:11
在类似的情况下,通常有用的标准技巧是将字符串的字符作为叶保留在平衡二叉树中。此外,树的内部节点应该保留出现在以特定节点为根的子树中的字母集(如果字母表很小且固定,则它们可以是位图)。
在这个结构中插入或删除一个字母只需要O(log(N))操作(更新根路径上的位图),查找第一个出现的字母也需要O(log(N))操作-从根向下,寻找其位图包含感兴趣的字母的最左边的子级。
编辑:内部节点还应该保留所表示的子树中的叶子数量,以便有效地计算字母的索引。
https://stackoverflow.com/questions/36122
复制相似问题