爱奇艺2018校招真题----平方串

题目描述

如果一个字符串S是由两个字符串T连接而成,即S = T + T, 我们就称S叫做平方串,例如"","aabaab","xxxx"都是平方串.
牛牛现在有一个字符串s,请你帮助牛牛从s中移除尽量少的字符,让剩下的字符串是一个平方串。换句话说,就是找出s的最长子序列并且这个子序列构成一个平方串。

输入描述:

输入一个字符串s,字符串长度length(1 ≤ length ≤ 50),字符串只包括小写字符。

输出描述:

输出一个正整数,即满足要求的平方串的长度。

示例1

输入

复制

frankfurt

输出

复制

4

解题思路:

     题目的意思就是把一个字符串拆成两个连续的子串,然后找出两个拆分串的最大公共子序列的长度,可以枚举给定字符串的拆分点,dp[i][j]表示的意思是两个拆分后的字符串0-i和0-j子串的最长公共子序列,用到dp的思想,核心代码如下:

if(str.charAt(i-1)==str1.charAt(j-1))
     dp[i][j]=dp[i-1][j-1]+1;
else
     dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
for(int i=1;i<str.length();i++)
{
      int num=p.Longest_common_substr(str.substring(0,i),str.substring(i));
      maxn=Math.max(maxn,num);
}

AC代码

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
import java.util.Vector;

public class test {
    public int Longest_common_substr(String str,String str1)
    {
        int[][] dp=new int[55][55];
        for(int i=1;i<=str.length();i++)
        {
            for(int j=1;j<=str1.length();j++)
            {
                 if(str.charAt(i-1)==str1.charAt(j-1))
                     dp[i][j]=dp[i-1][j-1]+1;
                 else
                     dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
            }
        }
        return dp[str.length()][str1.length()];
    }
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String str=scan.nextLine();
        int maxn=0;
        test p=new test();
        for(int i=1;i<str.length();i++)
        {
             int num=p.Longest_common_substr(str.substring(0,i),str.substring(i));
             maxn=Math.max(maxn,num);
        }
        System.out.println(maxn*2);
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值