leetcode5. 最长回文子串
题目来源:题目
题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
思路
思路一(暴力解法)
找到所有的字串,利用头尾指针的方式判断每个字串是否为回文串。使用头尾指针判断字串是否为回文串的时间复杂度为O(n).找每个字串的时间复杂度为O(n^2).所以总的时间复杂度为O(n^3).时间复杂度太高,通过不了本题。
思路二(中心扩展)
遍历字符串中的每个字符,判断以该字符为中间字符的回文串的最大长度。
该字符为中间字符有两种情况:
第一种是回文串的长度为奇数,该字符为最中间的一个字符,使用左右两个指针判断指向的字符是否相同,如果相同并且没有越界,则左右指针继续扩展。
第二种情况是回文串的长度为偶数,该字符为中间两个字符的左边字符,同样使用左右两个指针判断以该字符为中心的字符串是否为回文串。
思路三(动态规划)
用f(i,j)表示下标i到j的子字符串是否为回文串。f(i,j)值为true表示s[i,j]是回文串,f(i,j)的值为false,表示s[i,j]不是回文串。
回文串有这样一个特点:如果s[i,j]为回文串,则去点头尾两个字符依然为回文串,即s[i+1,j-1]依然是回文串。
当字串的长度大于2时,则有f(i,j) = f(i+1,j-1) && (Ci == Cj)
对于长度是1和2的字串,可以直接判断该字串是否为回文串。
然后建立二维布尔型数组,记录f(i,j)的值,然后找到值为true的j-i差值最大的即为要求的字串。
代码
思路二代码
public static String longestPalindrome(String s) {
int len = 0;
String subString = "";
for(int i = 0;i < s.length();i++){
int left = i - 1,right = i+1;
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
if(right - left - 1 > len){
len = right - left - 1;
subString = s.substring(left + 1,right);
}
left = i;
right = i + 1;
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
if(right - left - 1 > len){
len = right - left - 1;
subString = s.substring(left + 1,right);
}
}
return subString;
}
思路三代码
public static String longestPalindrome(String s) {
if(s == null || s.length() == 0)return "";
String ans = s.substring(0,1);
boolean[][] dp = new boolean[s.length()][s.length()];
for(int l = 0;l < s.length();l++){
for(int i = 0;i + l < s.length();i++){
int j = i + l;
if(l == 0){
dp[i][j] = true;
}else if(l == 1){
dp[i][j] = (s.charAt(i) == s.charAt(j));
}else {
dp[i][j] = (s.charAt(i) == s.charAt(j)) && dp[i + 1][j - 1];
}
if(dp[i][j] && j - i + 1 > ans.length())ans = s.substring(i,j+1);
}
}
return ans;
}
总结
思路一时间复杂度为O(n^3),空间复杂度为O(1).
思路二时间复杂度为O(n^2),空间复杂度为O(n^2).
思路三时间复杂度为O(n^2),空间复杂度为O(n^2).
相关知识
算法的艺术
字符串(づ。◕‿‿◕。)づ进阶之章
回文数+回文数加强版
字符串相关问题
最小操作次数
凤之舞健身操 子艺(木子)健身操 超强节奏 歌曲串烧 简单易学
t型结串钩绑法路亚?
为什么金刚菩提子手串那么受欢迎
俗称“无患子”,一种天然的洗涤剂,种子是菩提子,可作手串!
铁树 寿命最长的植物
网址: leetcode5. 最长回文子串 https://www.huajiangbk.com/newsview1385940.html
上一篇: 价格对社会供求有着很大的反作用, |
下一篇: 「超级干货大放送」机器学习十二种 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039