给定一个仅包含大小写字母和空格 ' '
的字符串,返回其最后一个单词的长度。
如果不存在最后一个单词,请返回 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 }