2020-09-06

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?

回文串的特点:把一个字符串反过来跟原字符串一样,比如 abcba 反过来还是abcba
题目中要求删除一些字符,剩下的为回文串,也就是说可以是不连续的。可以转换为最长公共子序列的问题,即将字符串s反转为s1,求s和s1的最长公共子序列。 比如 google 反转过来为 elgoog 最长公共子序列为goog。
求 google 和 elgoog的最长公共子序列可以借助动态规划的思想,一步步来求。

定义长度为length+1的二维数组,[i,j]表示 s的前i项和s1的前j项的最长公共子序列。
在这里插入图片描述上图就是构建的状态矩阵,第[ 2,3 ]项表示 s字符串从 0-1 的字串与 s1字符串从0-2的字串的最长公共子序列,即"go"和"elg"的最长公共子串,计算方法为,首先比较s的第2个字符和s1的第三个字符是否相等,如果相等,最长字串是两个字串往前一位的字串的最长公共部分+1。如果不相等,则最长的为s的i-1 和s1的j的最长和s的i位和s1的j-1位最长中更大的一个。

代码如下:

import java.util.Scanner;
import java.lang.StringBuilder;
import java.lang.Math;
public class Main{
    public static void main(String[] args)
    {
        Scanner in =new Scanner(System.in);
        while(in.hasNext())
        {
            String s = in.nextLine();
            String s1 =new StringBuilder(s).reverse().toString();
            int[][] arr = new int[s.length()+1][s.length()+1];
            
            for(int a=1;a<=s.length();a++)
            {
                for(int b=1;b<=s.length();b++)
                {
                    if(s.charAt(a-1)==s1.charAt(b-1))
                    {
                        arr[a][b]=arr[a-1][b-1]+1;
                    }
                    else
                    {
                        arr[a][b]=Math.max(arr[a-1][b],arr[a][b-1]);
                    }
                }
            }
            System.out.println(s.length()-arr[s.length()][s.length()]);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值