1. 程式人生 > 其它 >Leetcode題目總結[5]最長迴文子串

Leetcode題目總結[5]最長迴文子串

題目描述

給你一個字串s,找到s中最長的迴文子串。

示例 1:

輸入:s = "babad"
輸出:"bab"
解釋:"aba" 同樣是符合題意的答案。

示例 2:

輸入:s = "cbbd"
輸出:"bb"

示例 3:

輸入:s = "a"
輸出:"a"

示例 4:

輸入:s = "ac"
輸出:"a"

提示:

  • 1 <= s.length <= 1000
  • s僅由數字和英文字母(大寫和/或小寫)組成

做法

方法1

暴力做法

從大到小列舉子串並判斷該子串是否合法

時間複雜度O(n3)

提交會超時,87/177左右

程式碼

方法1

 1 /*
 2  * @lc app=leetcode.cn id=5 lang=cpp
3 * 4 * [5] 最長迴文子串 5 */ 6 7 // @lc code=start 8 class Solution { 9 public: 10 string longestPalindrome(string s) { 11 int len1 = s.length(); 12 int len2 = len1; 13 //len2--; 14 bool flag = true; 15 string str; 16 if(len1 == 1) return s; 17 //
printf("%d %d\n",len1,len2); 18 while(len2) 19 { 20 //printf("%d\n",len2); 21 if(len2 % 2 == 0) 22 { 23 for(int i = 0; i <= len1 - len2; i++) 24 { 25 for(int j = 1; j <= len2 / 2; j++) 26 {
27 if(s[i + j - 1] != s[i + len2 - j]) 28 { 29 flag = false; 30 } 31 } 32 if(flag == true) 33 { 34 for(int j = 1; j <= len2; j++) 35 { 36 str.push_back(s[i + j - 1]); 37 } 38 printf("%d",len2); 39 return str; 40 } 41 flag = true; 42 } 43 } 44 else 45 { 46 for(int i = 0; i <= len1 - len2; i++) 47 { 48 for(int j = 1; j <= len2 / 2; j++) 49 { 50 if(s[i + j - 1] != s[i + len2 - j]) 51 { 52 flag = false; 53 } 54 } 55 if(flag == true) 56 { 57 for(int j = 1; j <= len2; j++) 58 { 59 str.push_back(s[i + j - 1]); 60 } 61 return str; 62 } 63 flag = true; 64 } 65 } 66 len2--; 67 } 68 return str; 69 } 70 }; 71 // @lc code=end