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;
}