力扣算法题—058最后一个单词长度

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

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

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

 1 #include "000库函数.h"
 2 
 3 //用stringAPI
 4 class Solution {
 5 public:
 6     int lengthOfLastWord(string s) {
 7         int i = s.rfind(' ');//查找空格
 8         if(i==-1)return s.size();//无空格,整个字符串即为一个单词,包括空字符
 9         if (i == s.size() - 1) {//最后为空格,再向前找空格
10             s.erase(i, 1);//删除最后一个空格再去找
11             return lengthOfLastWord(s);
12         }
13         return s.size() - i - 1;
14     }
15 };
16 
17 //不该用递归,会加长时间和空间
18 //给一个空格标志就行
19 //好吧,比上面的时间复杂度高,但空间复杂度小
20 class Solution {
21 public:
22     int lengthOfLastWord(string s) {
23         int len = 0;
24         for (int i = 0; i < s.size(); ++i) {
25             if (i > 0 && s[i] != ' '&&s[i - 1] == ' ')
26                 len = 0;//遇到下一个单词,重新计算
27             if (s[i] != ' ')
28                 len++;//计算该单词的长度
29         }
30         return len;//返回的记录即使最后一个单词长度
31     }
32 };
33 
34 
35 
36 //我们关心的主要是非空格的字符,那么我们实际上在遍历字符串的时候,
37 //如果遇到非空格的字符,我们只需要判断其前面一个位置的字符是否为空格,
38 //如果是的话,那么当前肯定是一个新词的开始,将计数器重置为1,如果不是的话,
39 //说明正在统计一个词的长度,计数器自增1即可。但是需要注意的是,当i = 0的时候,
40 //无法访问前一个字符,所以这种情况要特别判断一下,归为计数器自增1那类。参见代码如下:
41 
42 
43 class Solution {
44 public:
45     int lengthOfLastWord(string s) {
46         int res = 0;
47         for (int i = 0; i < s.size(); ++i) {
48             if (s[i] != ' ') {
49                 if (i != 0 && s[i - 1] == ' ') res = 1;
50                 else ++res;
51             }
52         }
53         return res;
54     }
55 };
56 
57 
58 
59 //由于我们只关于最后一个单词的长度,所以开头有多少个空格起始我们并不在意,
60 //我们从字符串末尾开始,先将末尾的空格都去掉,然后开始找非空格的字符的长度即可,参见代码如下:
61 
62 
63 
64 class Solution {
65 public:
66     int lengthOfLastWord(string s) {
67         int right = s.size() - 1, res = 0;
68         while (right >= 0 && s[right] == ' ') --right;
69         while (right >= 0 && s[right] != ' ') {
70             --right;
71             ++res;
72         }
73         return res;
74     }
75 };
76 
77 
78 void T058() {
79     Solution sv;
80     string s;
81     s = "";
82     cout << s << endl << sv.lengthOfLastWord(s) << endl;
83     s = " ";
84     cout << s << endl << sv.lengthOfLastWord(s) << endl;
85     s = " asdff afd ";
86     cout << s << endl << sv.lengthOfLastWord(s) << endl;
87     s = "asd asdfa asdafsgasagsds";
88     cout << s << endl << sv.lengthOfLastWord(s) << endl;
89 }