给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度。

如果不存在最后一个单词,请返回 0 。

说明:一个单词是指由字母组成,但不包含任何空格的字符串。

示例:

输入: "Hello World"
输出: 5

上期的问题是:119,最大子序和

1public int maxSubArray(int A[]) {
2    int ans = A[0], i, j, sum = 0;
3    for (i = 0; i < A.length; i++) {
4        sum += A[i];
5        ans = sum > ans ? sum : ans;
6        sum = sum > 0 ? sum : 0;
7    }
8    return ans;
9}

解析:

他求的是连续子数组的最大和,sum是求子数组的和,但他并不是一直累加,当sum小于0的时候就让他归零,就相当于把它舍弃,因为一个负数加上任何一个数,都会比那个数小。如果大于0,就不要舍去,因为任何一个数加上一个正数都会比原来的数大。其实我们还可以换种写法

 1public int maxSubArray2(int[] A) {
2    int n = A.length;
3    int[] dp = new int[n];
4    dp[0] = A[0];
5    int max = dp[0];
6    for (int i = 1; i < n; i++) {
7        dp[i] = A[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0);
8        max = Math.max(max, dp[i]);
9    }
10    return max;
11}

dp数组的每个元素表示的是当前最大的子数组和。我们也可以先不在for循环中求max的值,最后返回数组dp中的最大值也是可以的。