leetcode-5 java版本

回文的定义:
正读和反读都相同的字符序列为“回文”,如“abcba”、“abcccba”是“回文”,“abcdea”和“ababab”则不是“回文”,也大体指具有对称性的。字符串的最长回文子串,是指一个字符串中包含的最长的回文子串。例如“1212134”的最长回文子串是“12121”。

由上面我们理解到回文的定义后,我们可以来分析用啥算法来解决这个问题:

  1. 假设只有一个变量则一定是回文字符串;
  2. 假设有两个字符的字符串,只有两个相等才是回文字符串;
  3. 如果假设字符串>3,假设有变量i,j。让其“i”指向一个字符串的开头,“j”指向尾部的元素;如果用f[i][j] 保存子串从i 到j是否是回文子串,那么在求f[i][j] 的时候如果j-i>=2时,如果 f[i][j] 为回文,那么f[i+1][j-1],也一定为回文。否则f[i][j]不为回文

 

package leetcode;

/**
 * @author 江河
 * @date 2019-07-07 20:25
 */
public class LongString5 {
  public static void main(String[] args) {
   String s="abcccab";
    String str=longestPalindrome(s);
    System.out.println(str);
  }
  public static String longestPalindrome(String s) {
    if (s == null || s.length() == 0) {
      return s;
    }
    //字符串转为字符数组
    // str = s.toCharArray();
    String str = "";
    int maxLen = 0;
    //定义一个数组长度
    boolean[][] dp = new boolean[s.length()][s.length()];
    for (int j = 0; j < s.length(); j++) {
      //一个元素肯定是回文串
      for (int i = 0; i <= j; i++) {
        //如果str[i]==str[j]在递归i+1与j-1比较的前提条件是j-i<2
        dp[i][j] = s.charAt(i) == s.charAt(j) && ((j-i<=2) || dp[i + 1][j - 1]);
        if (dp[i][j]) {
          if (j - i + 1 > maxLen) {
            maxLen = j - i + 1;
            str = s.substring(i, j + 1);
          }
        }
      }
    }
    return str;
  }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值