# 力扣 题目5- 最长回文子串

2022-08-07 17:35:13  阅读：120  来源： 互联网

# 题解

1.暴力解法 从前往后遍历途中对 以i为中心对称遍历 和 i也有对称数的对称遍历

2.动态规划 一个回文子串 意味着将两端去掉依然是回文子串 所以我们使用两层vector 记录从开始位置到结束位置是否是回文字符

# 代码

1.

``` 1 #include<iostream>
2 #include<string>
3 using namespace std;
4 class Solution {
5 public:
6     string longestPalindrome(string s) {
7         string result="";
8         string tem = "";
9         int left = 0;
10         int right = 0;
11         for (int i = 0; i < s.size(); i++) {
12         //1.中心对称
13             tem = s[i];
14             left = i-1;
15             right = i + 1;
16             while (left>-1&& right<s.size()&&s[left]==s[right])
17             {
18                 tem = s[left]+tem+s[right];
19                 left--;
20                 right++;
21             }
22             if (result.size() < tem.size()) {
23                 result = tem;
24             }
25             if (tem.size()== s.size()) {
26                 return s;
27             }
28
29             tem = "";
30         //2.双向对称
31             left = i;
32             right = i + 1;
33             while (left > -1 && right < s.size() && s[left] == s[right])
34             {
35                 tem = s[left] + tem + s[right];
36                 left--;
37                 right++;
38             }
39             if (result.size() < tem.size()) {
40                 result = tem;
41             }
42             if (tem.size() == s.size()) {
43                 return s;
44             }
45         }
46         return result;
47     }
48 };
49
50 int main() {
51     Solution sol;
52     string s = "cbbd";
53     string reslut=sol.longestPalindrome(s);
54     cout << reslut << endl;
55 }```
View Code

2.

``` 1 #include<iostream>
2 #include<vector>
3 #include<string>
4 using namespace std;
5 //vector<vector<string>>(s.size()) = { vector<string>(s.size(),"233") }
6 class Solution {
7 public:
8     string longestPalindrome(string s) {
9         int maxlenth = 0;
10         int left = 0;
11         int right = 0;
12         //vector<vector<vector<string>>> res(s.size(), vector<vector<string>>(s.size()) );
13         vector<vector<int>> res(s.size(), vector<int>(s.size(),0));
14         for (int i = s.size() - 1; i >= 0; i--) {
15             for (int j = i; j < s.size(); j++) {
16                 if (s[j]==s[i]) {
17                     //j与i相等 即同一个字符 符合回文
18                     if (j - i <= 1) {
19                         res[i][j] = true;
20                     }
21                     else if (res[i + 1][j - 1]) {
22                         res[i][j] = true;
23                     }
24                 }
25                 if (res[i][j] && j - i + 1 > maxlenth) {
26                     maxlenth = j - i + 1;
27                     left = i;
28                     right = j;
29                 }
30             }
31
32         }
33         return s.substr(left, right - left + 1);
34     }
35 };
36
37 int main() {
38     Solution sol;
39     string s = "cbbd";
40     string reslut=sol.longestPalindrome(s);
41     cout << reslut << endl;
42 }```
View Code

2. 关于本站的所有留言、评论、转载及引用，纯属内容发起人的个人观点，与本站观点和立场无关；
3. 关于本站的所有言论和文字，纯属内容发起人的个人观点，与本站观点和立场无关；
4. 本站文章均是网友提供，不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属；如您发现该文章侵犯了您的权益，可联系我们第一时间进行删除；
5. 本站为非盈利性的个人网站，所有内容不会用来进行牟利，也不会利用任何形式的广告来间接获益，纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。