大家好,欢迎来到IT知识分享网。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/
题目描述
给定一个字符串 s ,找出 s 中的最长回文子串。
题目分析
动态规划
用 P(i,j) 表示字符串第 i 到 j 个字母组成的串是否为回文串:
- P(i,j) = true,字符串第 i 到 j 个字母组成的子串是回文
- P(i,j) = false,其他情况
存在动态规划方程: P(i,j) = P(i + 1,j + 1) && s(i) == s(j)
- s(i) == s(j) : s 的第 i 和 j 个字母相同
- 若 i == j ,P(i,j) = true
代码实现
public class LongestPalindrome_5 { public static void main(String[] args) { LongestPalindrome_5 main = new LongestPalindrome_5(); String result = main.longestPalindrome("dddddababad"); System.out.println("result:" + result); } public String longestPalindrome(String s) { int len = s.length(); if (len == 1) { return s; } int begin = 0; int maxLen = 1; boolean[][] result = new boolean[len][len]; char[] charArray = s.toCharArray(); // 初始化 for (int i = 0; i < len; i++) { result[i][i] = true; } for (int sbLen = 2; sbLen <= len; sbLen++) { for (int i = 0; i < len; i++) { int end = i + sbLen - 1; // 小心数组越界 if (end >= len) { break; } if (charArray[i] == charArray[end]) { // 长度为 2 且字符相同 if (sbLen == 2) { result[i][end] = true; } else { result[i][end] = result[i + 1][end - 1]; } } else { result[i][end] = false; } // 取最大长度 if (result[i][end] && maxLen < sbLen) { maxLen = sbLen; begin = i; } } } return s.substring(begin, begin + maxLen); } }
运行结果:
复杂度
- 时间复杂度:O(n^2),其中 n 是字符串长度。
- 空间复杂度:O(n^2),存储动态规划状态需要的空间。
好了,今天就到这里,感谢各位看官到这里,不如点个关注吧!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/168143.html