最长回文子串浅析

000102
10

11

12
202122

aba
 for (int L = 2; L <= len; L++) {
            // 枚举左边界,左边界的上限设置可以宽松一些
            for (int i = 0; i < len; i++) {
                // 由 L 和 i 可以确定右边界,即 j - i + 1 = L 得
                int j = L + i - 1;
                // 如果右边界越界,就可以退出当前循环
                if (j >= len) {
                    break;
                }

                if (charArray[i] != charArray[j]) {
                    dp[i][j] = false;
                }

外层第一次循环         外层第二次循环.....        外层第Len次循环

j = 1;i = 0~len-1 ;                        j = 2;   i=0                             j = Len;i=0;

aba
a
b
a

最长回文子串

buffer:

truelen-2len-1
truelen-1
true

长度小于等于2的另作处理

循环从倒数第三行开始,列从倒数第一列开始,除去行与列相等的情况外

数组变化情况

1len-2len-1
2len-2len-1
3len-2len-1

倒过来循环可以使buffer[i][j] 获取 buffer[i+1][j-1]的状态从而使得动态规划执行。

   public String longestPalindrome(String s) {
        int len =  s.length();
        int maxlen = 1;
        int[][] buffer = new int[len][len];
        char[] charArray = s.toCharArray();
        //  int this = 0;
        int begin = 0;
        if(len<2){
            return  s;
        }
        //从后向前遍历字符串中所有子串
        for(int i=len-2;i>=0;i--){
            for(int j=len-1;j>i;j--){
                if(charArray[i]==charArray[j]){
                    if(j-i+1 <=3){
                        buffer[i][j] = 1;
                        if(j-i+1>maxlen){
                            maxlen = j-i+1;//更新maxlen
                            begin = i ;
                        }
                    }else{
                        buffer[i][j] = buffer[i+1][j-1];//判定之前的子串是否相等
                        if(buffer[i][j]==1&&j-i+1>maxlen){//大于之前的maxlen就更新
                            maxlen = j-i+1;
                            begin = i;
                        }
                    }
                }else{
                    buffer[i][j] = 0;
                }
            }
        }
        return s.substring(begin, begin + maxlen);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值