更正式地说,让str
成为有问题的字符串,并让其长度为l
。我知道使用substr
函数可以很容易地完成上述操作,如下所示:
str.substr(1)
str.substr(0,l-1)
但根据this页面,上述方法在O(l)
中执行了此操作。
有没有办法在O(1)
中实现相同的目标?
修改:在您将此问题标记为重复之前,请注意我要求 O(1) 实施以删除字符串的终端字符。没有任何一个问题的回答可以解决这个问题,显然是因为 问题没有提出要求。
答案 0 :(得分:2)
我不知道标准实际上是否保证这一点,但假设的复杂性是合理的:
str.resize(str.length() - 1);
是O(1)。如果假设不适合您的情况,您可以编写自己的字符串类。只要确保你在编写一个好的字符串类上花费的精力值得O(1)保证删除最后一个字符。
答案 1 :(得分:1)
substr
功能不会删除字符。您调用该函数的字符串不会被修改,因此所有字符都保持不变。尽管如此,调用它来选择包含除终结符之外的所有子字符串所需的时间将是O( n ),因为它涉及复制所有其他字符。
从字符串中删除字符所需的时间在于移动所有后续字符以替换删除的字符,就像substr
中发生的复制一样。字符串中通常包含 n 个字符,因此删除任意字符的复杂性为O( n )。
没有固定时间方法来删除任意长度的字符串的第一个字符。从字符串的 end 中删除具有固定数量字符 C 的字符可以在固定时间内完成,因此删除最终字符( C = 0)是O(1)。
如果经常需要在序列的末尾添加或删除元素,则可以考虑更适合该操作的数据结构。 list
和deque
都有用。
答案 2 :(得分:0)
要删除O(1)时间内std::string
的最后一个字符,
你可以将resize
字符串缩小到1个单位。
如果您想要一个表达式结果(不修改原始字符串),则必须使用除std::string
之外的其他类。一对迭代器可以很好地完成。