最长问题记录

1、最长回文字符串
例子:如”isabba” 、”abcbaXXab” 这样子的字符串,部分是回文的,求出最长的回文部分。

解法一思路:
穷尽字符串。将字符串拆分成子字符串,然后对子字符串进行回文判断,并记录其长度。

 public static void main(String[] args){
        String str = "isabbaXXab";
        int len = str.length();
        int maxLen = 0;
        String maxStr = "";
        for(int i = 0 ; i < len; i++){
            for(int j = i ; j <= len ; j++){
                if(isParm(str.substring(i,j))){
                    if(j - i > maxLen){
                        maxLen = j - i;
                        maxStr = str.substring(i,j);
                    }
                }

            }
        }
        System.out.println(maxLen);
        System.out.println(maxStr);

    }

    public static boolean isParm(String str){
        int len = str.length();
        for(int i = 0 ; i < len / 2; i++){
            if(str.charAt(i) != str.charAt(len - i - 1)){
                return false;
            }
        }
        return true;
    }

解法二:动态规划【本人是垃圾还没参透,参透了再记录】


2、有删除情况下的最长回文字符串
腾讯2016春招之算法

解题思路:

这个题严格意义上来说,删除了字符就谈不上回文串了,既然有删除,那估计考察的不是回文串,而是其他的,但是这个东西又有回文串的特点,细想一下——那就是不连续的回文串,想到不连续,就容易使人想到最长公共子序列,把源字符串逆序之后对比两个字符串发现:我靠,这不就是求两个序列的最长公共子序列(好像跟回文串没多大关系)。

这里写图片描述
这里写图片描述

考察:回文串,动态规划,知识迁移

int dpLCS[M][M]; //设置成全局变量,自动初始化为0

//动态规划法:最长回文子串,有删除,其实就是求最长公共子序列
int LongestCommonSequence(string str)
{
    size_t n = str.size();
    if (n == 0 || n == 1)
        return 1;

    string s = str;
    reverse(s.begin(), s.end());

    for (size_t i = 1; i <= n; ++ i) {
        for (size_t j = 1; j <= n; ++ j) {
            if (str[i-1] == s[j-1]) 
                dpLCS[i][j] = dpLCS[i-1][j-1] + 1;
            else 
                dpLCS[i][j] = max(dpLCS[i-1][j], dpLCS[i][j-1]); 
        }
    }
    return dpLCS[n][n];
}

本段转自:http://www.cnblogs.com/bakari/p/5358257.html
http://blog.csdn.net/biangren/article/details/8038605


3、数组内连续升序的最长个数
例子:如{5,3,4,7,2,9},3,4,7便是最长连续升序的。用动态规划来解决很简单。用一个dp[]来记录连续个数,通过比较每一个元素和之前的一个值的大小实现。

 public static void main(String[] args){
     int[] arr = {5,3,4,7,2,9};
     int length = arr.length;
     int[] dp = new int[length];
     dp[0] = 1;
     for(int i = 1; i < length; i++){
         if(arr[i] > arr[i-1]){
             dp[i] = dp[i-1]+1;
         } else {
             dp[i] = 1;
         }
    }
     int max = 0;
     for(int i = 0; i < length; i++){
         if(max < dp[i]){
             max = dp[i];
         }
     }
     System.out.print(max);
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值