力扣5-最长回文串

        题干:给你一个字符串 s,找到 s 中最长的回文子串。如输入"babad",则输出"aba";如输入"cbbd",则输出为“bb”。具体解析过程参考代码注释。

package learnproject.lekou;
/*
 * 5.最长回文串
 * 题干:给你一个字符串 s,找到 s 中最长的回文子串。
 */
public class Demo5 {
      /*s = "babad"
       * 1.假设字符串长度为n,当子串长度为1时,肯定是回文串
       * 2.当子串长度为2时,需要判断有没有满足回文条件的子串,此时记录开始字符以及长度
       * 3.当子串长度为3时,检测是否有满足回文条件的子串,以此类推
       * 4.所以这里就有一个核心点就是需要定义一个二维数组dp[i][j],用来表示i到j是否是一个回文子串
       *   这也造成了空间复杂度为O(n*n)
       * 5.每次循环遍历结束之后就要比较下看是否和max大,如果大就要更新begin和max,即最后要截取的字符串的位置
       * */
	 public String longestPalindrome(String s) {
              char[] stringChar = s.toCharArray();
              int length = stringChar.length;
              if(length == 1) {
            	  return s;
              }
              int max = 1;
              int begin = 0;
              boolean[][] dp = new boolean[length][length];
              for(int l=2;l<=length;l++) {
            	  for(int left=0;left<length;left++) {
            		  int right = l+left-1;
            		  if(right > length-1) {
            			  break;
            		  }
            		  if(stringChar[left] != stringChar[right]) {
            			  dp[left][right] = false;
            		  }else {
            			  //如果子串只有三个元素
            			  if(right-left<3) {
            				  dp[left][right] = true;
            			  }else {
            				  //如果子串的字符数大于3
            				  dp[left][right] = dp[left+1][right-1];
            			  }
            			  if(dp[left][right] && right-left+1 > max) {
            				  max = right-left+1;
            				  begin = left;
            			  }
            		  }
            	  }
              }
              return s.substring(begin,begin+max);
	    }
	
	 public static void main(String args[]) {
		 Demo5 demo = new Demo5();
		 String s = "cbbd";
		 System.out.println(demo.longestPalindrome(s));
	 }
	 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunny_daily

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值