子数组的最大累加和问题 &  最长回文子串

388 阅读1分钟

前言

“这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

1 NC19 子数组的最大累加和问题(简单)

2. NC17 最长回文子串

NC19 子数组的最大累加和问题

描述

给定一个数组arr,返回子数组的最大累加和

例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.

题目保证没有全为负数的数据

[要求]

时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)

输入:

[1, -2, 3, 5, -2, 6, -1]

返回值: 12

思路分析:

以 arr[i] 结尾的子数组的最大累加和 依赖于 以a[i-1] 结尾的子数组的最大累加和 和 arr[i]

定义 dp 数组 dp[i] 代表 以 arr[i] 结尾的最大累加和

dp[i] = Math.max(arr[i], dp[i-1] + arr[i])

因为 dp[i] 只与 dp[i-1] 相关 因此可以使用一个变量替代 dp 数组

AC 代码:

    public int maxsumofSubarray(int[] arr) {
        // write code here

        if (arr == null || arr.length == 0) {
            return 0;
        }
        int len = arr.length;

        
        int ans = arr[0];
        int dp = arr[0];

        for (int i = 1; i < len; i++) {
            dp = Math.max(arr[i], dp + arr[i]);
            ans = Math.max(ans, dp);
        }
        return ans;


    }

NC17 最长回文子串

描述

对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。 

给定字符串A以及它的长度n,请返回最长回文子串的长度。 

示例1

输入:

"abc1234321ab",12

返回值:

7

思路分析: 定义 dp 数组 dp[i][j]的值代表字符串从 i位置到 j位置是否是回文

dp[i][j] 的值 取决于 chars[i] chars[j] 是否相等 & dp[i+1][j-1]的值

当 chars[i] 不等于 chars[j] 说明 i到 j 不构成回文, 相等时 dp[i][j] = j - i == 1 || dp[i + 1][j - 1]

base case 当 i==j 时 dp[i][j] = true

注意遍历的方向 dp[i][j] 的值和 她左下角的位置相关

dp[i][j] = true 更新最大回文长度

AC 代码:

import java.util.*;

public class Solution {
    public int getLongestPalindrome(String A, int n) {
        // write code here
        boolean[][] dp = new boolean[n][n];
        int maxLen = 1;

        for (int i = 0; i < n; i++) dp[i][i] = true;

        for (int i = n - 1; i >= 0; i--) {
            for (int j = i + 1; j < n; j++) {
                if (A.charAt(i) != A.charAt(j)) continue;
                dp[i][j] = j - i == 1 || dp[i + 1][j - 1];
                if (dp[i][j]) {
                    maxLen = Math.max(maxLen, j - i + 1);
                }
            }
        }
        return maxLen;
    }
}