我对C ++比较陌生。我正在练习编码问题,这与将字符串转换为回文有关。
我将字母表的数量存储在一个向量中,然后像这样生成回文 -
string palindrome_string;
for (short i = 0; i < 26; ++i) {
alphabet_count[i] /= 2;
for (short j = 0; j < alphabet_count[i]; ++j)
palindrome_string += string(1, static_cast<char>('a' + i));
}
但是对于特定的测试用例(仅包含2.10 ^ 5 e
的输入),程序超出了256 MB的内存限制。然后我用这个语句替换了内部循环 -
palindrome_string += string(alphabet_count[i], static_cast<char>('a' + i));
并且该程序运行良好,仅使用大约2.4 MB。
所以我想问一下,这是否与使用串联与构造函数的性能有关,如果是,那么可能的原因/是什么?
如果重要,我用MS VC ++ 2010编译了该程序。
如果有帮助,以下是提交内容(代码) - the failed one(测试用例:10)和the successful one。
答案 0 :(得分:0)
std::string
应该以实现摊销的恒定时间的方式分配内存。一个简单的实现是每次需要更多空间时增长2倍,如here所述。
每次在内循环中向palindrome_string
添加内容时,该字符串都有可能重新分配内存。但是,我不明白这是多么糟糕。我的意思是即使上面提到的简单实现在内部循环的迭代中将内存加倍,那么在下一次迭代中不需要再次重新分配空间,对吧?
答案 1 :(得分:0)
问题不是表现,而是内循环。 j
类型为short
,alphabet_count[i]
类型为long
,这就是它发生的原因。