当前位置:  首页>> 技术小册>> 数据结构与算法(中)

难度: Medium

内容描述

  1. 给定一个字符串s,找出s中最长的回文子字符串。你可以假设s的最大长度为1000
  2. Example 1:
  3. Input: "babad"
  4. Output: "bab"
  5. Note: "aba" is also a valid answer.
  6. Example 2:
  7. Input: "cbbd"
  8. Output: "bb"

解题方案

思路 1
**- 时间复杂度: O(n^2)**- 空间复杂度: O(n^2)**

使用动态规划的思路,用一个二维数组cache[i][j]记录i到j是否为回文串, beats 54.36%

  1. class Solution {
  2. // 采用动态规划
  3. // 如果 i == j ,则只有一个字母 肯定是回文串
  4. // 如果 char[i] == char[j] && j == i + 1 , 两个字母相等 肯定是回文串
  5. // 如果 char[i] == char[j] && j > i + 1 && cache[i+1][j-1]为true,则肯定是回文串
  6. public String longestPalindrome(String s) {
  7. if(s == null || s.length() <2){
  8. return s;
  9. }
  10. boolean[][] cache = new boolean[s.length()][s.length()]; // 记录 i ~ j 是否是回文串
  11. char[] chars = s.toCharArray();
  12. int len = s.length();
  13. int start = 0;
  14. int end = 0;
  15. // 采用至底向上的动态规划,也可以采用递归方式
  16. for(int i = len - 1; i >= 0; i --){
  17. for(int j = i; j < len; j ++){
  18. if(i == j){
  19. cache[i][j] = true;
  20. }else if(j == i + 1 && chars[i] == chars[j]){
  21. cache[i][j] = true;
  22. if(end - start + 1 < 2){
  23. end = j;
  24. start = i;
  25. }
  26. }else if(chars[i] == chars[j] && cache[i + 1][j-1]){
  27. cache[i][j] = true;
  28. if(end - start < j-i){
  29. start = i;
  30. end = j;
  31. }
  32. }else{
  33. cache[i][j] = false;
  34. }
  35. }
  36. }
  37. return s.substring(start,end+1);
  38. }
  39. }

该分类下的相关小册推荐: