C++ 求字符串中最后一个单词的长度 [LeetCode 58]

题目:

给你一个字符串s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。
单词是指仅由字母组成、不包含任何空格字符的最大子字符串。

示例 1:
输入:s = "Hello World"
输出:5

示例 2:
输入:s = "   fly me   to   the moon  "
输出:4

示例 3:
输入:s = "luffy is still joyboy"
输出:6
 
提示:
1 <= s.length <= 104
s 仅有英文字母和空格 ' ' 组成
s 中至少存在一个单词

链接:https://leetcode-cn.com/problems/length-of-last-word

 

第一次成功提交的思路是把字符串翻转后,用find和subStr函数去一步步分割,存到vector里,最后vector里得到的第一个字符串就是:

#include<iostream>
#include<algorithm>
#include<map>
#include<string>
#include<vector>
using namespace std;
std::vector<std::string> splitWithStl(const std::string& str, const std::string& pattern)
{
    std::vector<std::string> resVec;
    if ("" == str)
    {
        return resVec;
    }
    //方便截取最后一段数据
    std::string strs = str + pattern;
    size_t pos = strs.find(pattern);
    size_t size = strs.size();
    while (pos != std::string::npos)//不断根据“ ”分割字符串
    {
        std::string x = strs.substr(0, pos);
        if(x!="")
            resVec.push_back(x); //将非空的字符串存到vector里
        strs = strs.substr(pos + 1, size);//分割完第一个后继续操作
        pos = strs.find(pattern);//不断重复
    }
    return resVec;
}

int lengthOfLastWord(string s) 
{
    reverse(s.begin(), s.end());
    vector<string> vec = splitWithStl(s, " ");
    return vec.front().size();
}

int main()
{
    string s = "   fly me   to   the moon  ";
    cout << lengthOfLastWord(s) << endl;
}

结果就是内存占用很大,17M,原因很简单,新建的vector里把分割出的单词都存进去了,到这里我觉得我想的太复杂了,应该有更简单的方法。

从字符层面去做,既然是找最后一个单词,那么可以直接从从后往前遍历这个字符串,只需要找出第一次出现不是空格“ ”的位置,然后从此位置计数,直到出现空格“ ”或者到字符串的尽头即可。

想的太多反而忘了最基本,也是最简单的做法,代码如下:

int lengthOfLastWord(string s) 
{
    int len=0;
    for(int i=s.size()-1;i>=0;--i)
    {
        if(s[i]!=' ')  //找到第一个不是“ ”的位置,开始计数
            len++;
        else if(len!=0)// 如果有“ ”出现,就说明最后一个单词找完了,返回
            return len;
    }
    return len; //最后一个单词的前边没有空格,直接返回
}

内存占用只有6.4M,大大减少

posted @ 2021-09-13 15:41  北陌南旬  阅读(330)  评论(0)    收藏  举报