1. 题目描述
给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。
如果不存在最后一个单词,请返回 0 。
说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/length-of-last-word
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 示例
3. 思路
- 从头开始遍历,这样要循环一次字符串的长度,就可以了,但是时间复杂度太高了,后来换成了从后往前遍历,这样就不需要遍历整个字符串,而是当遍历一个单词之后遇到空格就直接返回了
4. 遇上的问题
从后往前遍历的时候会遇到两种情况,一种结尾是以‘ ’开始的,一种是结尾以单词开始的。这样就会判定输出的时候要进行进一步的判断,确定遇到空格的时候之前的遍历是否已经遇到过字符。
5. 具体实现代码
自己写的代码
- 从前往后遍历。
class Solution {
public int lengthOfLastWord(String s) {
int count = 0;
//会遇到的情况是:
// 前面遍历完单词的长度之后,遇到空格之后会遇到两种情况
// 1.遇到空格再遇到空格
// 2.遇到空格再遇到字符
for(int i =0;i<s.length();i++){
//当遇到空格,
if(s.charAt(i)==' '){
//再判断长度,长度不能抵达最后面
if(i<s.length()-1){
//当连续两个空格,不能直接返回
if(s.charAt(i+1)==' ')
continue;
//如果后面不是空格证明后面还有单词则把之前的数清0
else
count=0;
}
else
return count;
}
else{
count++;
}
}
return count;
}
}
- 从后往前遍历
class Solution {
public int lengthOfLastWord(String s) {
//count用于计数单词长度
int count = 0;
//通过flag设置,返回时判断需要
int flag = 0;
if("".equals(s)) return count;
for(int i = s.length()-1;i>0;i--){
//当遇到单词的时候把flag设置为空
if(s.charAt(i)!=' '){
flag = 1;
count++;
}
//当遇到空格并且该字符前面还有不为空格的字符并且已经遍历过单词了,返回
else if(s.charAt(i)==' '&&s.charAt(i-1)!=' '&&flag==1)
return count;
}
if(s.charAt(0)!= ' ') count++;
return count;
}
}
6. 学习收获,优秀题解一如既往的妙啊
class Solution {
public int lengthOfLastWord(String s) {
int end = s.length() - 1;
//第一个遍历去除末端所有的空格,遇到字符跳出循环
while(end >= 0 && s.charAt(end) == ' ') end--;
//证明字符串中不存在单词
if(end < 0) return 0;
int start = end;
//从最后面的单词末端开始遍历,遇到空格跳出循环
while(start >= 0 && s.charAt(start) != ' ') start--;
//单词末端到单词前端,单词长度
return end - start;
}
}
作者:guanpengchn
链接:https://leetcode-cn.com/problems/length-of-last-word/solution/hua-jie-suan-fa-58-zui-hou-yi-ge-dan-ci-de-chang-d/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这样的话,我的第二个题解,比他优秀一咩咩,感觉到了开心!这个题没有官方解析,遗憾遗憾。
7 题目来源
要自主学习!------swrici