力扣第5题:最长回文子串(动态规划)
小学生一枚,自学信奥中,没参加培训机构,所以命名不规范、代码不优美是在所难免的,欢迎指正。
标签:
字符串、动态规划、中心扩散法
语言:
C++
题目:
给你一个字符串s,找到s中最长的回文子串。
截图:

代码:
class Solution {
public:string longestPalindrome(string s) {string maxs;if (s.size() == 1)return s; // 回文子串是它本身if (s.size() == 2) {if (s[0] == s[1])return s; // aaelse {string s1 = "";s1 = s1 + s[0];return s1; // ab}}// x是任意字符,不是字母xif (s[0] == s[1]) { // aaxmaxs = maxs + s[0] + s[1]; // maxs=aaif (s[1] == s[2]) { // aaamaxs = maxs + s[2]; // maxs=aaa}} else {if (s[0] == s[2]) { // axamaxs = maxs + s[0] + s[1] + s[2]; // maxs=axa}}for (int i = 2; i < s.size(); i++) {//以字符i为中心,向两边扩散,获取最长回文串int left = 0, right = 0;int j = i - 1;while (j >= 0 and s[j] == s[i]) {j--;left--;}j = i + 1;while (j < s.size() and s[j] == s[i]) {j++;right++;}//左右指针移动,先判断是否越界再偏移j = 1;while (i + right + j <= s.size() and i + left - j >= 0 and s[i + left - j] == s[i + right + j]) {j++;}j--;//判断回文if ((i + right + j) - i - left + j + 1 > maxs.size()) {maxs = "";for (int k = i + left - j; k <= i + right + j; k++) {maxs = maxs + s[k];}}//存储回文}return maxs;}
};
