腾讯-构造回文

题目描述:
这里写图片描述
解题思路:
将输入的字符串逆序,求其和原字符串的最长公共子序列的长度。
知识点:
最长公共子序列求解。
学习参考:https://www.cnblogs.com/xudong-bupt/archive/2013/03/15/2959039.html

  • 一个字符串的子序列,是指从该字符串中去掉任意多个字符后剩下的字符在不改变顺序的情况下组成的新字符串。
  • 最长公共子序列,是指多个字符串可具有的长度最大的公共的子序列。

动态规划求最长公共子序列的长度
动态规划采用二维数组来标识中间计算结果,避免重复的计算来提高效率。
这里写图片描述

字符串str = “abcda”,其逆序reStr = “adcba”
图示二维矩阵的变化:
这里写图片描述

import java.util.Scanner;

public class huiwenStr {
    public static int LCS(String str) {
        char[] strC = str.toCharArray();
        char [] reStr = new char[strC.length];
        //str逆序
        int x=strC.length-1;
        for(int j=0;j<reStr.length;j++) {
                reStr[j]=strC[x];
                x--;
        }

        int [][] num= new int[str.length()+1][str.length()+1];
        //初始化第一行和第一列元素为0
        for(int i =0;i<str.length()+1;i++) {
            num[0][i] = 0;
            num[i][0] =0;
        }
        for(int i=1;i<str.length()+1;i++) {
            for(int j=1;j<str.length()+1;j++) {
                if(strC[i-1]==reStr[j-1]) {
                    num[i][j] = num[i-1][j-1]+1;
                }else if(num[i][j-1]>num[i-1][j]){
                    num[i][j] = num[i][j-1];
                }else {
                    num[i][j] = num[i-1][j];
                }
            }
        }
        int large = num[str.length()][str.length()];
        return str.length()-large;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String str = in.nextLine();
            System.out.println(LCS(str));
        }

    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值