Capitalize first and last character of each word of a string

Problem Statement: Given a string, write a program to Capitalize the first and last character of each word of that string.

Examples:

Example 1:
Input: String str = "take u forward is awesome"
Output: “TakE U ForwarD IS AwesomE”
Explanation: We get the result after capitalizing the first and last character of each word of a string

Example 2:
Input: String str = "Take u Forward is Awesome"
Output: “TakE U ForwarD IS AwesomE”
Explanation: Characters T, F, A are initially in uppercase , so they remain as they are in the result.

Solution

Disclaimer: Don’t jump directly to the solution, try it out yourself first.

Solution 1:

Approach:

  • Keep on iterating the given string:
  • Convert first and last index character to uppercase if initially the string character is in lowercase 
  • Convert the characters present before and after “space” to uppercase if initially the string character is in lowercase 
  • Return the final string

Things to note:

  • (int) str[i] gives the ASCII value of the ith string character 
  • ((int) str[i] – 32) gives the ASCII value of the Capitalized ith string character 
  • (char)((int) str[i] – 32) converts the ASCII value to its corresponding character
  • In Java , the StringBuffer class is used to create mutable (modifiable) strings.

Code:

C++ Code

#include<bits/stdc++.h>

using namespace std;
void Capitalize(string str, int size) {
  for (int i = 0; i < size; i++) {
    if (i == 0 || i == (size - 1) && (int) str[i] >= 97) // Converting first and
    last index character to uppercase
    {
      str[i] = ((char)((int) str[i] - 32));
    } else if (str[i] == ' ') // Converting characters present before and after
     space to uppercase
    {
      if (((int) str[i - 1] - 32) >= 65) // Checking if already not an uppercase
      letter
        str[i - 1] = ((char)((int) str[i - 1] - 32));

      if (((int) str[i + 1] - 32) >= 65) // Checking if already not an uppercase
      letter
        str[i + 1] = ((char)((int) str[i + 1] - 32));
    }
  }

  cout<<"String after capitalizing the first and last letter of each word of the
  string: "<< "\n";
  cout << str << "\n";
}
int main() {

  // Input string
  string str = "take u forward is awesome";
  int size = str.length();

  Capitalize(str, size);
  return 0;
}

Output:

String after capitalizing the first and last letter of each word of the string:
TakE U ForwarD IS AwesomE

Time Complexity: O(n), n is the length of string

Space Complexity: O(1)

Java Code

public class TUF {
  public static String Capitalize(String str, int size) {
    StringBuffer sb = new StringBuffer(str);

    for (int i = 0; i < size; i++) {
      if (i == 0 || i == (size - 1) && (int) str.charAt(i) >= 97) //Converting first
      and last index character to uppercase
      {
        sb.setCharAt(i, (char)((int) str.charAt(i) - 32));
      } else if (str.charAt(i) == ' ') // Converting characters present before and
      after space to uppercase
      {
        if (((int) str.charAt(i - 1) - 32) >= 65) // Already not an uppercase letter
          sb.setCharAt(i - 1, (char)((int) str.charAt(i - 1) - 32));

        if (((int) str.charAt(i + 1) - 32) >= 65) // Already not an uppercase letter
          sb.setCharAt(i + 1, (char)((int) str.charAt(i + 1) - 32));
      }
    }

    return sb.toString();
  }
  public static void main(String args[]) {
    String str = "take u forward is awesome";
    int size = str.length();

    System.out.println("String after capitalizing the first and last letter of each 
    word of the string: ");
    System.out.println(Capitalize(str, size));
  }
}

Output:

String after capitalizing the first and last letter of each word of the string:
TakE U ForwarD IS AwesomE

Time Complexity: O(n), n is the length of string

Space Complexity: O(n), because of StringBuffer

Solution 2: Using towupper() in C++ , Character.toUpperCase() in Java

Approach: 

Similar approach as solution 1, the only change is, here we use the towupper function in C++ to capitalize the corresponding characters instead of using the ASCII values and typecasting approach.

towupper(): converts wide characters into uppercase

Character.toUpperCase(): converts the character argument to uppercase

Code:

C++ Code

#include<bits/stdc++.h>

using namespace std;

void Capitalize(string str, int size) {
  for (int i = 0; i < size; i++) {
    if (i == 0 || i == (size - 1)) // Converting first and last index character to
    uppercase
    {
      str[i] = towupper(str[i]);
    } else if (str[i] == ' ') // Converting characters present before and after
     space to uppercase
    {
      str[i - 1] = towupper(str[i - 1]);
      str[i + 1] = towupper(str[i + 1]);

    }
  }

  cout<<"String after capitalizing the first and last letter of each word of the
  string:" << "\n";
  cout << str << "\n";

}
int main() {

  // Input string
  string str = "take u forward Is awesome";
  int size = str.length();

  Capitalize(str, size);
  return 0;
}

Output:

String after capitalizing the first and last letter of each word of the string:
TakE U ForwarD IS AwesomE

Time Complexity: O(n), n is the length of string

Space Complexity: O(1)

Java Code

public class TUF {
  public static String Capitalize(String str, int size) {
    StringBuffer sb = new StringBuffer(str);

    for (int i = 0; i < size; i++) {
      if (i == 0 || i == (size - 1)) // Converting first and last index character to
      uppercase
      {
        sb.setCharAt(i, Character.toUpperCase((char)(int) str.charAt(i)));
      } else if (str.charAt(i) == ' ') // Converting characters present before and
       after space to uppercase
      {
        sb.setCharAt(i - 1, Character.toUpperCase((char)(int) str.charAt(i - 1)));
        sb.setCharAt(i + 1, Character.toUpperCase((char)(int) str.charAt(i + 1)));
      }
    }

    return sb.toString();
  }
  public static void main(String args[]) {
    String str = "Take u Forward is Awesome";
    int size = str.length();

    System.out.println("String after capitalizing first and last letter of each word
    of the string: ");
    System.out.println(Capitalize(str, size));
  }
}

Output:

String after capitalizing the first and last letter of each word of the string:
TakE U ForwarD IS AwesomE

Time Complexity: O(n), n is the length of string

Space Complexity: O(n), because of StringBuffer

Special thanks to Rishiraj Girmal for contributing to this article on takeUforward. If you also wish to share your knowledge with the takeUforward fam, please check out this article