最长回文子串(C++,详细注释)
#include<bits/stdc++.h> using namespace std; class Solution { //ps:测试样例:"acbca" public: string longestPalindrome(string s) { if (s.length() <= 1) { //当字符串太短,直接返回本身 return s; } int begin = 0, end = 0, max_length = 0; //最长回文子串的开始、终止下标,以及长度 int i, j; bool judge[1000][1000] = {}; //注意设置bool,否则int型无法定义到1000,会超界 for (i = 1; i < s.length(); i++) { for (j = 0; j < i; j++) { /*首尾相等。 并且要么在首尾相等的情况下,首尾之间的字符少于3个,则默认是回文串; 要么大于3个,但是前面之间已经符合回文串(cbc)了,那么此次首尾又相等, 则中间不用再判断,默认加上后就是个更大的回文串了*/ if (s.at(j) == s.at(i) && (i - j + 1 <= 3 || judge[j + 1][i - 1] == true)) { judge[j][i] = true; int length = i - j + 1; if (length > max_length) { max_length = length; begin = j; end = i; } } } } if (max_length == 0) { //当不存在回文串,则首字母本身要算个回文串 max_length = 1; } return s.substr(begin, max_length); //从下标begin开始,截取max_length个字符的字符串 } }; int main() { Solution sol; string s; while (1) { cin >> s; cout << sol.longestPalindrome(s) << endl << endl; } return 0; }
详解:
测试结果:
下一篇:
为什么要学习设计模式?