131. 分割回文串 - 力扣(LeetCode)
std::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时代码截取到字符串末尾).