LeetCode 05:最长回文子串(Java实现)

LeetCode 05:最长回文子串(Java实现)

题目

  • 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
    示例 1:输入: “babad”,输出: “bab”,注意: “aba” 也是一个有效答案。
    示例 2:输入: “cbbd”,输出: “bb”
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/longest-palindromic-substring
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法1:暴力法

  • 思路:暴力寻找
    通过两层for循环,验证字符串s中所有的子字符串是否为回文子串。当s比较短的时候,此方法可行;担当s比较长的时候,运行时间就会超出限制。
    其中使用到了int java.lang.String.length(),String java.lang.String.substring(int beginIndex, int endIndex),char java.lang.String.charAt(int index)三个库函数
  • 代码
/*暴力法*/
 class Solution {
  public String longestPalindrome(String s){
   String ans = s;
   int maxlen = 0;
   boolean flag;
   int len = s.length();
    
   for(int i=0;i
  • 结果
    LeetCode 05:最长回文子串(Java实现)_第1张图片
    LeetCode 05:最长回文子串(Java实现)_第2张图片

方法2:暴力法的优化

  • 思路:暴力寻找的优化
    思路一有许多重复判断,没有充分利用每次判断的结果,导致时间复杂度增加。若想知道P(i,j)是否是回文子串,只需要知道P(i+1,j-1)的情况。用了动态规划的方法,即把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解。这就需要引入二维数组,来记录已经判断出来的P(i+1,j-1),这样,拿空间换时间,提高了空间复杂度,降低了时间复杂度。
    需要注意:当i+1
  • 代码
class solution2{
  public String longestPalindrome(String s){
   int length = s.length();
   String ans = s;
   boolean test[][] = new boolean[length][length]; 
   int maxlen = 0;
   /*遍历所有子字符串的长度即可,不必判断每个子字符串*/
   for(int len=1;len<=length;len++){
    /*从头到尾截取长度为len的字符串来判断是否为回文子串*/    
    for(int left=0;left=length) break;//下标越界,结束循环
     /*易错点:逻辑运算符,由于“||”具有短路的功能,所以只能把test[left+1][right-1]放后边
      * 即使使用“|”也不行,因为没有短路的话数组会越界
      * 此处不必像思路一一样调用函数,节省了时间*/
     test[left][right] = (len==1||len==2||test[left+1][right-1])&&s.charAt(left)==s.charAt(right);
      if(test[left][right]&&len>maxlen){
       /*易错点*/
     ans = s.substring(left, right+1);
     maxlen = ans.length();
      }
    }
   }
   return ans;
  }
 }
  • 结果
    LeetCode 05:最长回文子串(Java实现)_第3张图片
  • 易错点
    循环的控制,到底从几循环到几,到底是<=还是<要考虑清楚了,此处虽小,但很烦人很易错;
    另外注意一下代码中注释的易错点。

你可能感兴趣的:(LeetCode 05:最长回文子串(Java实现))