算法修炼之路—【字符串】Leetcode 58 最后一个单词的长度

题目描述

给定一个仅包含字母(不限大小写)和空格' '的字符串s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。

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

说明: 一个单词是指仅由字母组成、不包含任何空格字符的最大子字符串

示例:

输入: s = “Hello World”
输出: 5

思路分析

难度是简单 , 这道题需要注意的有几点:

  1. 全为空字符‘ ’
  2. 字符末尾存在若干空字符' ';
  3. 如何确定某个单词的长度?
  4. 若字符串中仅存在一个单词时,是否存在边界异常?

对于问题1,2 ,我们简单一些通过String.trim()直接将字符串前后的空格均去掉即可(当然,也可以自己编码进行末尾空字符去除),去除的好处就是使得核心代码功能更单一,纯粹;

对于问题3,假设给定字符串为Hello World,我们已知最后一个单词的下标为s.length() - 1,这时只求解字符W前一空字符下标即可,当满足s.charAt(i) == ' '时,即为所求,此时可知最后一个单词的长度为s.length() - i - 1;

对于问题4,我们必须考虑这个边界条件,因为其不存在s.charAt(i) == ' '的情况,故我们在返回值做一点判断即可:retrun i == -1 ? s.length() : res

我们直接给出解题代码:

解题代码

代码1: 基本实现

    public static int solution(String s) {
        if (s == null || s == "") {
            return 0;
        }     

        s = s.trim();
        
        int len = s.length();
        int i;
        int res = 0;
        
        for(i = len - 1; i >= 0; i--){
            if(s.charAt(i) == ' '){
                res = len - i - 1;
                break;
            }
        }
        
        return i == -1 ? len : res;
    }

代码2: 代码优化

    public static int solution(String s) {
        if (s == null || s == "") {
            return 0;
        }     
        s = s.trim();
        
        int len = s.length();
        int i  = len - 1;
        
        while(i >= 0 && s.charAt(i) != ' '){
            i--;
        }
        
        return i < 0 ? len : len - i - 1;
    }

这道题目其实可以考虑的角度有很多,小伙伴们不妨多发散思考一下,也可以在文章下留言分享~~

复杂度分析

这里我们设S为字符串总长度;l为最后一个单词长度;

时间复杂度: 这里我们倒序访问字符,则时间复杂度为O(l + 1);
空间复杂度: 没有辅助容器,故空间复杂度为O(1);

Github源码

完整可运行文件请访问GitHub

猜你喜欢

转载自blog.csdn.net/u011106767/article/details/105857643