最朴实无华的就是两个嵌套循环遍历所有的子串,然后再一个循环判定是否为回文,On³的复杂度
然而判定回文的时候,可以从子串出发:
若这个串去掉头尾的时候不是回文串,那么这个串一定不是回文串。
那么我们只需要从回文串增加头尾再判定即可(只判定头尾是否相等
所以有两种,一种是偶数串,一种奇数串,分别判定一遍即可
代码#include#include using namespace std; int palindrome(string s) { int l = s.length(); int max = 1; bool* arr = new bool[l * l]; memset(arr, false, sizeof(bool) * l * l); for(int i = 0; i < l; i++) { arr[i * l + i] = 1; int left = i - 1; int right = i + 1; while(left >= 0 && right < l) { if(s[left] != s[right]) { break; } else { arr[left * l + right] = true; if(right - left + 1 > max) max = right - left + 1; } left--;right++; } } for(int i = 0; i < l - 1; i++) { int left = i; int right = i + 1; while(left >= 0 && right < l) { if(s[left] != s[right]) { break; } else { arr[left * l + right] = true; if(right - left + 1 > max) max = right - left + 1; } left--;right++; } } // for(int i = 0; i < l; i++) // { // for(int j = 0; j < l; j++) // cout << static_cast (arr[i*l + j]) << " " ; // cout << endl; // } delete[] arr; return max; } int main() { int t; cin >> t; for(int i = 0; i < t; i++) { cout << "case #" << i << ":"< > s; cout << palindrome(s) << endl; } return 0; }



