LeetCode141--最长回文子串、盛水最多的容器

这篇博客介绍了LeetCode的两道题目:1)最长回文子串,通过头尾指针判断字符串的子串是否为回文,寻找最长的回文串;2)盛水最多的容器,分析问题关键在于移动较大边界的指针以求得最大容量。
摘要由CSDN通过智能技术生成

1、最长回文子串(L05)

//给你一个字符串 s,找到 s 中最长的回文子串。 
//
// 
//
// 示例 1: 
//
// 
//输入:s = "babad"
//输出:"bab"
//解释:"aba" 同样是符合题意的答案。
// 
//
// 示例 2: 
//
// 
//输入:s = "cbbd"
//输出:"bb"
// 
//
// 示例 3: 
//
// 
//输入:s = "a"
//输出:"a"
// 
//
// 示例 4: 
//
// 
//输入:s = "ac"
//输出:"a"
// 
//
// 
//
// 提示: 
//
// 
// 1 <= s.length <= 1000 
// s 仅由数字和英文字母(大写和/或小写)组成 
// 
// Related Topics 字符串 动态规划

此题直接判断各种不同长度的子字符串是不是回文串,所以重要的是如何取出字符串s的所有子串,而且长度从大到小,先把固定长度的所有子字符串都给取完,这就是需要我们的头尾指针,每一轮都取固定长度的子字符串,固定长度的子字符串有多少条我们是可以算出来的,所以需要进行计数,当这个长度的子字符串到了这个数量,就取计算更小长度的子字符串了。最后程序是这样的:

class Solution {
    public String longestPalindrome(String s) {
        int i = 0;
        int j = s.length() - 1;
        //每次有多少个固定长度的子字符串,比如长度为s.length()的就只有一条
        int m = 0;
        while(i < j){
            int n = i;
            int k = j;
            int l = m;
            while(l>=0){
                if(isPalindrome(s, n, k)){
                    return s.substring(n, k+1);
                }
                //检查一条完事一条
                l--;
                //头尾指针不断往后面推
                n++;
                k++;
            }
            //条数不断增多
            m = m+1;
            //长度不断减小,因为i都是从0开始的,所以只用对j进行操作
            j = j-1;
        }
        //说明没有回文子串,所以取一个字母返回就可以了
        return s.substring(0, 1);
    }
    //判断字符串的子字符串是不是一个回文字符串
    private boolean isPalindrome(String str, int i, int j){
        while(i<j){
            if(str.charAt(i) != str.charAt(j)){
                return false;
            }
            i++;
            j--;
        }
        return true;
    }
}

2、盛水最多的容器

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器。

 

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

这个题目只需要想通一点,那就是怎样进行指针的移动,首先我们考虑两个指针分别处于左右两个端点,然后开始移动,容器的容量是由两个边界中较小的一边x以及两个边界之间的距离s决定的,所以当我们移动较大的那个边界时,x不会变的更大,而s会变得更小,这样容量也变得比较小的,于是我们应该移动比较大的那个边界

public int maxArea(int[] height) {
        int sum = 0;
        int i = 0;
        int j = height.length -1;
        while(i < j){
            int vol = (j - i) * Math.min(height[i], height[j]);
            if(vol > sum){
                sum = vol;
            }
            if(height[i]>height[j]){
                j--;
            }else{
                i++;
            }
        }
        return sum;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值