数组
Level | Operators | Associativity |
---|---|---|
5 | *, /, % | Left |
6 | +, - | Left |
7 | <<, >> | Left |
双指针
// 双指针法
bool isPalindrome(const string& s, int start, int end) {
for (int i = start, j = end; i < j; ++i, --j) {
if (s[i] != s[j]) return false;
}
return true;
}
动态规划
判断[i, n]是否为回文, 需要2个条件
所以构造 [i][j]二维判断查找表isPalindrome
[i,j]结果依靠[i+1, j-1], 所以i倒序,j正序
vector<vector<bool>> isPalindrome;
void computePalindrome(const string& s) {
// isPalindrome[i][j] 代表 s[i:j](双边包括)是否是回文字串
isPalindrome.resize(
s.size(),
vector<bool>(s.size(), false)); // 根据字符串s, 刷新布尔矩阵的大小
for (int i = s.size() - 1; i >= 0; i--) {
// 需要倒序计算, 保证在i行时, i+1行已经计算好了
for (int j = i; j < s.size(); j++) {
// 一些细节处理
if (j == i) { // 1个字符的情况
isPalindrome[i][j] = true;
} else if (j - i == 1) { // 2个字符的情况
isPalindrome[i][j] = (s[i] == s[j]);
} else {
isPalindrome[i][j] = (s[i] == s[j] && isPalindrome[i + 1][j - 1]);
}
}
}
}