Given a string s consisting of upper/lower-case alphabets and empty space characters ‘ ‘, return the length of the last word in the string. If the last word does not exist, return 0.
Examples:
Input : str = "Geeks For Geeks" Output : 5 length(Geeks)= 5 Input : str = "Start Coding Here" Output : 4 length(Here) = 4 Input : ** Output : 0
Approach 1: Iterate String from index 0
If we iterate the string from left to right, we would have to be careful about the spaces after the last word. The spaces before the first word can be ignored easily. However, it is difficult to detect the length of the last word if there are spaces at the end of the string. This can be handled by trimming the spaces before or at the end of the string. If modifying the given string is restricted, we need to create a copy of the string and trim spaces from that.
C++
#include <iostream>
#include <string>
using
namespace
std;
class
GFG {
public
:
int
lengthOfLastWord(
const
string& a) {
int
len = 0;
string x = a;
x.erase(0, x.find_first_not_of(
" "
));
x.erase(x.find_last_not_of(
" "
) + 1);
for
(
int
i = 0; i < x.length(); i++) {
if
(x[i] ==
' '
)
len = 0;
else
len++;
}
return
len;
}
};
int
main() {
string input =
"Geeks For Geeks "
;
GFG gfg;
cout <<
"The length of last word is "
<< gfg.lengthOfLastWord(input) << endl;
return
0;
}
Java
public
class
GFG {
public
int
lengthOfLastWord(
final
String a)
{
int
len =
0
;
String x = a.trim();
for
(
int
i =
0
; i < x.length(); i++) {
if
(x.charAt(i) ==
' '
)
len =
0
;
else
len++;
}
return
len;
}
public
static
void
main(String[] args)
{
String input =
"Geeks For Geeks "
;
GFG gfg =
new
GFG();
System.out.println(
"The length of last word is "
+ gfg.lengthOfLastWord(input));
}
}
Python3
def
lengthOfLastWord(a):
l
=
0
x
=
a.strip()
for
i
in
range
(
len
(x)):
if
x[i]
=
=
" "
:
l
=
0
else
:
l
+
=
1
return
l
if
__name__
=
=
"__main__"
:
inp
=
"Geeks For Geeks "
print
(
"The length of last word is"
,
lengthOfLastWord(inp))
C#
using
System;
class
GFG {
public
virtual
int
lengthOfLastWord(
string
a)
{
int
len = 0;
string
x = a.Trim();
for
(
int
i = 0; i < x.Length; i++) {
if
(x[i] ==
' '
) {
len = 0;
}
else
{
len++;
}
}
return
len;
}
public
static
void
Main(
string
[] args)
{
string
input =
"Geeks For Geeks "
;
GFG gfg =
new
GFG();
Console.WriteLine(
"The length of last word is "
+ gfg.lengthOfLastWord(input));
}
}
Javascript
<script>
function
lengthOfLastWord(a)
{
let len = 0;
x = a.trim();
for
(let i = 0; i < x.length; i++) {
if
(x[i] ==
' '
) {
len = 0;
}
else
{
len++;
}
}
return
len;
}
input =
"Geeks For Geeks "
;
document.write(
"The length of last word is "
+ lengthOfLastWord(input));
</script>
Output
The length of last word is 5
Approach 2: Iterate the string from the last index. This idea is more efficient since we can easily ignore the spaces from the last. The idea is to start incrementing the count when you encounter the first alphabet from the last and stop when you encounter a space after those alphabets.
C++
#include <bits/stdc++.h>
#include <iostream>
using
namespace
std;
int
length(string str)
{
int
count = 0;
bool
flag =
false
;
for
(
int
i = str.length() - 1; i >= 0; i--) {
if
((str[i] >=
'a'
&& str[i] <=
'z'
)
|| (str[i] >=
'A'
&& str[i] <=
'Z'
)) {
flag =
true
;
count++;
}
else
{
if
(flag ==
true
)
return
count;
}
}
return
count;
}
int
main()
{
string str =
"Geeks for Geeks"
;
cout <<
"The length of last word is "
<< length(str);
return
0;
}
Java
public
class
GFG {
public
int
lengthOfLastWord(
final
String a)
{
boolean
char_flag =
false
;
int
len =
0
;
for
(
int
i = a.length() -
1
; i >=
0
; i--) {
if
(Character.isLetter(a.charAt(i))) {
char_flag =
true
;
len++;
}
else
{
if
(char_flag ==
true
)
return
len;
}
}
return
len;
}
public
static
void
main(String[] args)
{
String input =
"Geeks For Geeks "
;
GFG gfg =
new
GFG();
System.out.println(
"The length of last word is "
+ gfg.lengthOfLastWord(input));
}
}
Python3
def
findLength(
str
):
count
=
0
flag
=
False
for
i
in
range
(
len
(
str
)
-
1
,
-
1
,
-
1
):
if
((
str
[i] >
=
'a'
and
str
[i] <
=
'z'
)
or
(
str
[i] >
=
'A'
and
str
[i] <
=
'Z'
)):
flag
=
True
count
+
=
1
elif
(flag
=
=
True
):
return
count
return
count
str
=
"Geeks for Geeks"
print
(
"The length of last word is"
,
findLength(
str
))
C#
using
System;
class
GFG {
public
virtual
int
lengthOfLastWord(
string
a)
{
bool
char_flag =
false
;
int
len = 0;
for
(
int
i = a.Length - 1; i >= 0; i--) {
if
(
char
.IsLetter(a[i])) {
char_flag =
true
;
len++;
}
else
{
if
(char_flag ==
true
) {
return
len;
}
}
}
return
len;
}
public
static
void
Main(
string
[] args)
{
string
input =
"Geeks For Geeks "
;
GFG gfg =
new
GFG();
Console.WriteLine(
"The length of last word is "
+ gfg.lengthOfLastWord(input));
}
}
PHP
<?php
function
length(
$str
)
{
$count
= 0;
$flag
= false;
for
(
$i
=
strlen
(
$str
)-1 ;
$i
>=0 ;
$i
--)
{
if
( (
$str
[
$i
] >=
'a'
&&
$str
[
$i
]<=
'z'
) ||
(
$str
[
$i
] >=
'A'
&&
$str
[
$i
]<=
'Z'
))
{
$flag
= true;
$count
++;
}
else
{
if
(
$flag
== true)
return
$count
;
}
}
return
$count
;
}
$str
=
"Geeks for Geeks"
;
echo
"The length of last word is "
, length(
$str
);
?>
Javascript
function
length(str) {
let count = 0;
let flag =
false
;
for
(let i = str.length - 1; i >= 0; i--) {
if
((str[i] >=
'a'
&& str[i] <=
'z'
)
|| (str[i] >=
'A'
&& str[i] <=
'Z'
)) {
flag =
true
;
count++;
}
else
{
if
(flag ==
true
)
return
count;
}
}
return
count;
}
let str =
"Geeks for Geeks"
;
console.log(`The length of last word is ${length(str)}`);
Output
The length of last word is 5
Method #3 : Using split() and list
- As all the words in a sentence are separated by spaces.
- We have to split the sentence by spaces using split().
- We split all the words by spaces and store them in a list.
- Print the length of the last word of the list.
Below is the implementation:
C++
#include <iostream>
#include <string>
#include <vector>
using
namespace
std;
int
length(string str) {
vector<string> lis;
string word =
""
;
for
(
char
c : str) {
if
(c ==
' '
) {
lis.push_back(word);
word =
""
;
}
else
{
word += c;
}
}
lis.push_back(word);
return
lis.back().length();
}
int
main() {
string str =
"Geeks for Geeks"
;
cout <<
"The length of last word is "
<< length(str) << endl;
return
0;
}
Java
import
java.util.ArrayList;
import
java.util.List;
public
class
Main {
public
static
int
length(String str) {
List<String> lis =
new
ArrayList<>();
String word =
""
;
for
(
char
c : str.toCharArray()) {
if
(c ==
' '
) {
lis.add(word);
word =
""
;
}
else
{
word += c;
}
}
lis.add(word);
return
lis.get(lis.size() -
1
).length();
}
public
static
void
main(String[] args) {
String str =
"Geeks for Geeks"
;
System.out.println(
"The length of last word is "
+ length(str));
}
}
Python3
def
length(
str
):
lis
=
list
(
str
.split(
" "
))
return
len
(lis[
-
1
])
str
=
"Geeks for Geeks"
print
(
"The length of last word is"
,
length(
str
))
Javascript
<script>
function
length(str)
{
var
lis = str.split(
" "
)
return
lis[lis.length - 1].length;
}
var
str =
"Geeks for Geeks"
document.write(
"The length of last word is "
+
length(str));
</script>
C#
using
System;
public
class
Program {
static
int
length(
string
str)
{
string
[] lis = str.Split(
' '
);
return
lis[lis.Length - 1].Length;
}
static
void
Main()
{
string
str =
"Geeks for Geeks"
;
Console.WriteLine(
"The length of last word is "
+ length(str));
}
}
Output
The length of last word is 5
METHOD 4:Using regular expressions
APPROACH:
The regular expression essentially matches all non-space characters at the end of the string. The re.findall() function then returns a list of all non-overlapping matches in the input string, which in this case is just a single match consisting of the last word. Finally, the join() function is used to join the list of characters into a single string, and the length of this string (i.e., the length of the last word) is returned by the functio
ALGORITHM:
1.Import the re module for regular expressions
2.Use the findall() function to find all non-space characters at the end of the string
3.Join the resulting list of characters into a string
4.Return the length of the resulting string
Python3
import
re
def
length_of_last_word_4(s):
last_word
=
'
'.join(re.findall('
[^ ]
*
$', s))
return
len
(last_word)
s
=
"Geeks For Geeks"
print
(length_of_last_word_4(s))
s
=
"Start Coding Here"
print
(length_of_last_word_4(s))
s
=
""
print
(length_of_last_word_4(s))
Time complexity: O(n), where n is the length of the input string
Space complexity: O(n), where n is the length of the input string
This article is contributed by Saloni Baweja. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
There are lots of ways to achieve that. The most efficient approach is to determine the index of the last white space followed by a letter.
It could be done by iterating over indexes of the given string (reminder: String
maintains an array of bytes internally) or simply by invoking method lastIndexOf()
.
Keeping in mind that the length of a string that could be encountered at runtime is limited to Integer.MAX_VALUE
, it’ll not be a performance-wise solution to allocate in memory an array, produced as a result of splitting of this lengthy string, when only the length of a single element is required.
The code below demonstrates how to address this problem with Stream IPA and a usual for
loop.
The logic of the stream:
- Create an
IntStream
that iterates over the indexes of the given string, starting from the last. - Discard all non-alphabetic symbols at the end of the string with
dropWhile()
. - Then retain all letters until the first non-alphabetic symbol encountered by using
takeWhile()
. - Get the count of element in the stream.
Stream-based solution:
public static int getLastWordLength(String source) {
return (int) IntStream.iterate(source.length() - 1, i -> i >= 0, i -> --i)
.map(source::charAt)
.dropWhile(ch -> !Character.isLetter(ch))
.takeWhile(Character::isLetter)
.count();
}
If your choice is a loop there’s no need to reverse the string. You can start iteration from the last index, determine the values of the end
and start
and return the difference.
Just in case, if you need to reverse a string that is the most simple and efficient way:
new StringBuilder(source).reverse().toString();
Iterative solution:
public static int getLastWordLength(String source) {
int end = -1; // initialized with illegal index
int start = 0;
for (int i = source.length() - 1; i >= 0; i--) {
if (Character.isLetter(source.charAt(i)) && end == -1) {
end = i;
}
if (Character.isWhitespace(source.charAt(i)) && end != -1) {
start = i;
break;
}
}
return end == -1 ? 0 : end - start;
}
main()
public static void main(String[] args) {
System.out.println(getLastWord("Humpty Dumpty sat on a wall % _ (&)"));
}
output
4 - last word is "wall"
Introduction
I am still on the journey of solving at least one Data Structures and Algorithm question daily on Leetcode in order to understand the concepts I am learning well and it has been very challenging and interesting since I started solving these questions.
This article will explain my solution to Length of Last Word in a String on Leetcode and the logic behind my solution. Try to follow it step by step and I am sure you will understand every bit of it.
Let’s dive into it 🎉
Given a string s consisting of some words separated by some number of spaces, return the length of the last word in the string.
A word is a maximal substring consisting of non-space characters only.
Example
- Input: s = «Hello World»
- Output: 5
- Explanation: The last word is «World» with length 5.
Step by Step Solution
Solving a Data Structures and Algorithm question requires you to think well and check your solution using different scenarios because your solution must pass all the test cases before it can be accepted.
We will solve this problem in 2 steps, which are:
- Doing Sanity Checks.
- Explaining the Logic behind our solution and writing the Code to back it up.
Sanity Checks
Before proceeding to carry out any operation we have to check the input passed to the function if it is valid. so let’s do a minor check that if it is not valid.
// Sanity Checks
if (!s) {
return s;
}
The last check is if the length of the string is 1, just return the length of the string directly because it is also the last word.
if(s.length <= 1) {
return s.length;
}
But if none of these conditions is met then we can proceed to carry out the main operation.
Solution Logic
The Solution to this question will be in steps for easy understanding.
-
Trim the string with the trim method
trim()
in order to remove whitespaces from the left and right sides of the string. -
After removing the whitespaces with trim then we can now turn the string to an array so that it will be very easy to get the last value of the array by index.
-
To turn the string to array, we will use the split method
split(" ")
. There must be space between the double quote so that it can split it by words, if there is no space between the quote it will split it by character.
s.trim().split(" ");
- Let’s store this new array in a variable called
arrStr
let arrStr = s.trim().split(" ");
-
The next thing is to get the last item in the array of words, we can get it by the index and to get the index of the last item in every array the index is always the length of the array — 1 because array starts the index from 0.
-
So since the index is
[arrStr.length - 1]
. then the last item of the array can now be gotten like this
arrStr[arrStr.length - 1]
- Since we have gotten the last item, we can just use the
.length
method to get the length.
arrStr[arrStr.length - 1].length;
- Lastly, return the length of the last word.
return arrStr[arrStr.length - 1].length;
The Time and Space Complexity
Time Complexity
This Solution has a Time complexity of O(n) which is a Linear time since we are splitting the string to an array and it depends on the length of the string.
Space complexity
The Space Complexity is also O(n) since we are using extra space to store the words in an array.
The Runtime is 60ms, faster than 98.80% of JavaScript online submissions for Length of Last Word and Memory Usage: 38.8 MB, less than 47.63% of JavaScript online submissions.
Conclusion
I hope you have learnt a lot from this article and your contribution is also highly welcomed because we get better by learning from others, you can reach out to me on Twitter here. Watch out for more helpful contents on Data Structures and Algorithm from me.
Don’t forget to Like, share and subscribe for more articles in this series called Solutions to Data Structures and Algorithm Questions on Leetcode.
Enjoy 🎉
Welcome back, LeetCoders! Today I’ll be tackling problem #58, which is called Length of Last Word. From the description:
Given a string
s
consisting of words and spaces, return the length of the last word in the string.
A word is a maximal substring consisting of non-space characters only.
Now, there’s a clean way and a not so clean way to accomplish the task we’re given. Being the person I am, I’m going to go the easy route.
My thoughts on solving this problem were to simply strip the whitespace off the ends of the string, then to split it into an array and grab the length of the last word. A bigger challenge would be to deal with all of the spaces in an efficient manner so we’re only left with the words in the array and not random spaces — but I’m solving it the quick and dirty way, which is to only strip what we need.
So let’s get started. We’re given a string s
, so we’ll start by just having the function return the string (makes it easier to debug).
var findLengthOfLastWord = function(s) {
return s;
}
Enter fullscreen mode
Exit fullscreen mode
Now, let’s incorporate some of the logic we talked about. We need to 1) strip both ends of the string, 2) split it into an array, 3) grab the last element of the array, and 4) return that element’s length. Fortunately, there’s a one-liner that does the job.
return s.trim().split(' ').slice(-1)[0].length;
Enter fullscreen mode
Exit fullscreen mode
You could also use trimEnd()
instead of trim()
, because if you think about it, the only trimming we need to do is from the end so we know what the true last word is. Both are about the same speed though, so I’ll leave it with trim()
.
So there you have it. A truly janky solution to a classic LeetCode problem.
var lengthOfLastWord = function(s) {
return s.trim().split(' ').slice(-1)[0].length;
};
Enter fullscreen mode
Exit fullscreen mode
As always, code can be found in the Github repository.
Happy coding!
Description
LeetCode Problem 58.
Given a string s consisting of some words separated by some number of spaces, return the length of the last word in the string.
A word is a maximal substring consisting of non-space characters only.
Example 1:
1
2
3
Input: s = "Hello World"
Output: 5
Explanation: The last word is "World" with length 5.
Example 2:
1
2
3
Input: s = " fly me to the moon "
Output: 4
Explanation: The last word is "moon" with length 4.
Example 3:
1
2
3
Input: s = "luffy is still joyboy"
Output: 6
Explanation: The last word is "joyboy" with length 6.
Constraints:
- 1 <= s.length <= 10^4
- s consists of only English letters and spaces ‘ ‘.
- There will be at least one word in s.
Sample C++ Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
/* Start from the tail of s and move backwards to find the first non-space character.
Then from this character, move backwards and count the number of non-space characters
until we pass over the head of s or meet a space character. The count will then be the
length of the last word. */
int lengthOfLastWord(string s) {
int len = 0, tail = s.length() - 1;
while (tail >= 0 && s[tail] == ' ') tail--;
while (tail >= 0 && s[tail] != ' ') {
len++;
tail--;
}
return len;
}
};
08 Nov 2021