reverse和substr用法

reverse和substr用法 131. 分割回文串 - 力扣LeetCodestd::string对象本身不能直接加上整数来当做地址使用。在 C 中std::reverse需要传入的是迭代器Iterator而不是简单的字符串对象加偏移量。以下是具体的错误分析以及两种修复方案方案一修复你现有的逻辑利用迭代器要获取string的迭代器需要使用.begin()。另外需要注意的是C 标准库算法如reverse操作的区间通常是左闭右开[first, last)的。如果你的end是子串的最后一个字符的下标即包含在内你需要写成tmp.begin() end 1。C#include string #include algorithm using namespace std; bool hui(string s, int start, int end) { string tmp s; // 使用 .begin() 获取迭代器并注意 C 是左闭右开区间 reverse(tmp.begin() start, tmp.begin() end 1); return s tmp; }方案二更优的标准做法双指针法虽然方案一可以跑通但在算法设计中我们通常不推荐用这种方式来判断回文。原因每次调用函数都要复制整个字符串string tmp s;浪费空间。即使子串很短例如长度为 3最后依然要通过s tmp比较整个母串浪费时间。更高效的做法是使用“双指针”从两端向中间逼近只检查需要的那个子串时间复杂度降低到 $O(N)$空间复杂度降低到 $O(1)$。C#include string using namespace std; // 建议将参数改为 const string避免不必要的字符串拷贝 bool hui(const string s, int start, int end) { while (start end) { if (s[start] ! s[end]) { return false; // 只要有一处不匹配就不是回文 } start; end--; } return true; // 全部匹配是回文 }总结如果你只是想修好当前的语法错误把tmp start改为tmp.begin() start即可如果你是在刷算法题比如最长回文子串、回文分割等强烈建议使用方案二的双指针法这可以帮你避免因超时而导致的代码不通过。substr(start, len)可以从字符串的start从0开始截取一个长度为len的字符串缺省len时代码截取到字符串末尾