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,大大减少
荡尘涤污,重整河山,便在今日