Open In App

Check a given sentence for a given set of simple grammar rules

Improve
Improve
Like Article
Like
Save
Share
Report

A simple sentence if syntactically correct if it fulfills given rules. The following are given rules.

  1. Sentence must start with a Uppercase character (e.g. Noun/ I/ We/ He etc.) 
  2. Then lowercase character follows. 
  3. There must be spaces between words. 
  4. Then the sentence must end with a full stop(.) after a word. 
  5. Two continuous spaces are not allowed. 
  6. Two continuous upper case characters are not allowed. However, the sentence can end after an upper case character.

Examples: 

Correct sentences -
   "My name is Ram."
   "The vertex is S."
   "I am single."
   "I love Geeksquiz and Geeksforgeeks."

Incorrect sentence - 
   "My name is KG."
   "I lovE cinema."
   "GeeksQuiz. is a quiz site."
   "  You are my friend."
   "I love cinema" 

Question: Given a sentence, validate the given sentence for above-given rules.

We strongly recommend to minimize the browser and try this yourself first. 

The idea is to use an automata for the given set of rules.

Algorithm: 

  1. Check for the corner cases 
    • Check if the first character is uppercase or not in the sentence. 
    • Check if the last character is a full stop or not.
  2. For rest of the string, this problem could be solved by following a state diagram. Please refer to the below state diagram for that. 
  3. We need to maintain previous and current state of different characters in the string. Based on that we can always validate the sentence of every character traversed.

A C based implementation is below. (By the way this sentence is also correct according to the rule and code) 

C++




// C++ program to validate a given sentence for a set of rules
#include <bits/stdc++.h>
using namespace std;
 
// Method to check a given sentence for given rules
bool checkSentence(string str)
{
   
    // Calculate the length of the string.
    int len = str.size();
 
    // Check that the first character lies in [A-Z].
    // Otherwise return false.
    if (str[0] < 'A' || str[0] > 'Z')
        return false;
 
    //If the last character is not a full stop(.) no
    //need to check further.
    if (str[len - 1] != '.')
        return false;
 
    // Maintain 2 states. Previous and current state based
    // on which vertex state you are. Initialise both with
    // 0 = start state.
    int prev_state = 0, curr_state = 0;
 
    //Keep the index to the next character in the string.
    int index = 1;
 
    //Loop to go over the string.
    while (str[index])
    {
        // Set states according to the input characters in the
        // string and the rule defined in the description.
        // If current character is [A-Z]. Set current state as 0.
        if (str[index] >= 'A' && str[index] <= 'Z')
            curr_state = 0;
 
        // If current character is a space. Set current state as 1.
        else if (str[index] == ' ')
            curr_state = 1;
 
        // If current character is [a-z]. Set current state as 2.
        else if (str[index] >= 'a' && str[index] <= 'z')
            curr_state = 2;
 
        // If current state is a dot(.). Set current state as 3.
        else if (str[index] == '.')
            curr_state = 3;
 
        // Validates all current state with previous state for the
        // rules in the description of the problem.
        if (prev_state == curr_state && curr_state != 2)
            return false;
 
        if (prev_state == 2 && curr_state == 0)
            return false;
 
        // If we have reached last state and previous state is not 1,
        // then check next character. If next character is '\0', then
        // return true, else false
        if (curr_state == 3 && prev_state != 1)
            return (str[index + 1] == '\0');
 
        index++;
 
        // Set previous state as current state before going over
        // to the next character.
        prev_state = curr_state;
    }
    return false;
}
 
// Driver program
int main()
{
    string str[] = { "I love cinema.", "The vertex is S.",
                    "I am single.", "My name is KG.",
                    "I lovE cinema.", "GeeksQuiz. is a quiz site.",
                    "I love Geeksquiz and Geeksforgeeks.",
                    "  You are my friend.", "I love cinema" };
    int str_size = sizeof(str) / sizeof(str[0]);
    int i = 0;
    for (i = 0; i < str_size; i++)
    {
        if(checkSentence(str[i]))
            cout << "\"" << str[i] << "\"" << " is correct \n";
        else
            cout << "\"" << str[i] << "\"" << " is incorrect \n";
    }
    return 0;
}
 
// This code is contributed by aditya942003patil


C




// C program to validate a given sentence for a set of rules
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
 
// Method to check a given sentence for given rules
bool checkSentence(char str[])
{
    // Calculate the length of the string.
    int len = strlen(str);
 
    // Check that the first character lies in [A-Z].
    // Otherwise return false.
    if (str[0] < 'A' || str[0] > 'Z')
        return false;
 
    //If the last character is not a full stop(.) no
    //need to check further.
    if (str[len - 1] != '.')
        return false;
 
    // Maintain 2 states. Previous and current state based
    // on which vertex state you are. Initialise both with
    // 0 = start state.
    int prev_state = 0, curr_state = 0;
 
    //Keep the index to the next character in the string.
    int index = 1;
 
    //Loop to go over the string.
    while (str[index])
    {
        // Set states according to the input characters in the
        // string and the rule defined in the description.
        // If current character is [A-Z]. Set current state as 0.
        if (str[index] >= 'A' && str[index] <= 'Z')
            curr_state = 0;
 
        // If current character is a space. Set current state as 1.
        else if (str[index] == ' ')
            curr_state = 1;
 
        // If current character is [a-z]. Set current state as 2.
        else if (str[index] >= 'a' && str[index] <= 'z')
            curr_state = 2;
 
        // If current state is a dot(.). Set current state as 3.
        else if (str[index] == '.')
            curr_state = 3;
 
        // Validates all current state with previous state for the
        // rules in the description of the problem.
        if (prev_state == curr_state && curr_state != 2)
            return false;
 
        if (prev_state == 2 && curr_state == 0)
            return false;
 
        // If we have reached last state and previous state is not 1,
        // then check next character. If next character is '\0', then
        // return true, else false
        if (curr_state == 3 && prev_state != 1)
            return (str[index + 1] == '\0');
 
        index++;
 
        // Set previous state as current state before going over
        // to the next character.
        prev_state = curr_state;
    }
    return false;
}
 
// Driver program
int main()
{
    char *str[] = { "I love cinema.", "The vertex is S.",
                    "I am single.", "My name is KG.",
                    "I lovE cinema.", "GeeksQuiz. is a quiz site.",
                    "I love Geeksquiz and Geeksforgeeks.",
                    "  You are my friend.", "I love cinema" };
    int str_size = sizeof(str) / sizeof(str[0]);
    int i = 0;
    for (i = 0; i < str_size; i++)
     checkSentence(str[i])? printf("\"%s\" is correct \n", str[i]):
                            printf("\"%s\" is incorrect \n", str[i]);
 
    return 0;
}


Java




// Java program to validate a given sentence
// for a set of rules
class GFG
{
 
    // Method to check a given sentence for given rules
    static boolean checkSentence(char[] str)
    {
 
        // Calculate the length of the string.
        int len = str.length;
 
        // Check that the first character lies in [A-Z].
        // Otherwise return false.
        if (str[0] < 'A' || str[0] > 'Z')
            return false;
 
        // If the last character is not a full stop(.)
        // no need to check further.
        if (str[len - 1] != '.')
            return false;
 
        // Maintain 2 states. Previous and current state
        // based on which vertex state you are.
        // Initialise both with 0 = start state.
        int prev_state = 0, curr_state = 0;
 
        // Keep the index to the next character in the string.
        int index = 1;
 
        // Loop to go over the string.
        while (index <= str.length)
        {
 
            // Set states according to the input characters
            // in the string and the rule defined in the description.
            // If current character is [A-Z]. Set current state as 0.
            if (str[index] >= 'A' && str[index] <= 'Z')
                curr_state = 0;
 
            // If current character is a space.
            // Set current state as 1.
            else if (str[index] == ' ')
                curr_state = 1;
 
            // If current character is [a-z].
            // Set current state as 2.
            else if (str[index] >= 'a' && str[index] <= 'z')
                curr_state = 2;
 
            // If current state is a dot(.).
            // Set current state as 3.
            else if (str[index] == '.')
                curr_state = 3;
 
            // Validates all current state with previous state
            // for the rules in the description of the problem.
            if (prev_state == curr_state && curr_state != 2)
                return false;
                 
            if (prev_state == 2 && curr_state == 0)
                return false;
 
            // If we have reached last state and previous state
            // is not 1, then check next character. If next character
            // is '\0', then return true, else false
            if (curr_state == 3 && prev_state != 1)
                return (index + 1 == str.length);
 
            index++;
 
            // Set previous state as current state
            // before going over to the next character.
            prev_state = curr_state;
        }
        return false;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        String[] str = { "I love cinema.", "The vertex is S.",
                         "I am single.", "My name is KG.",
                         "I lovE cinema.", "GeeksQuiz. is a quiz site.",
                         "I love Geeksquiz and Geeksforgeeks.",
                         " You are my friend.", "I love cinema" };
        int str_size = str.length;
 
        int i = 0;
        for (i = 0; i < str_size; i++)
        {
            if (checkSentence(str[i].toCharArray()))
                System.out.println("\"" + str[i] +
                                   "\"" + " is correct");
            else
                System.out.println("\"" + str[i] +
                                   "\"" + " is incorrect");
        }
    }
}
 
// This code is contributed by
// sanjeev2552


Python3




# Python program to validate a given sentence for a set of rules
 
# Method to check a given sentence for given rules
def checkSentence(string):
 
    # Calculate the length of the string.
    length = len(string)
 
    # Check that the first character lies in [A-Z].
    # Otherwise return false.
    if string[0] < 'A' or string[0] > 'Z':
        return False
 
    # If the last character is not a full stop(.) no
    # need to check further.
    if string[length-1] != '.':
        return False
 
    # Maintain 2 states. Previous and current state based
    # on which vertex state you are. Initialise both with
    # 0 = start state.
    prev_state = 0
    curr_state = 0
 
    # Keep the index to the next character in the string.
    index = 1
 
    # Loop to go over the string.
    while (string[index]):
        # Set states according to the input characters in the
        # string and the rule defined in the description.
        # If current character is [A-Z]. Set current state as 0.
        if string[index] >= 'A' and string[index] <= 'Z':
            curr_state = 0
 
        # If current character is a space. Set current state as 1.
        else if string[index] == ' ':
            curr_state = 1
 
        # If current character is a space. Set current state as 2.
        else if string[index] >= 'a' and string[index] <= 'z':
            curr_state = 2
 
        # If current character is a space. Set current state as 3.
        else if string[index] == '.':
            curr_state = 3
 
        # Validates all current state with previous state for the
        # rules in the description of the problem.
        if prev_state == curr_state and curr_state != 2:
            return False
 
        # If we have reached last state and previous state is not 1,
        # then check next character. If next character is '\0', then
        # return true, else false
        if prev_state == 2 and curr_state == 0:
            return False
 
        # Set previous state as current state before going over
        # to the next character.
        if curr_state == 3 and prev_state != 1:
            return True
 
        index += 1
 
        prev_state = curr_state
 
    return False
 
# Driver program
string = ["I love cinema.", "The vertex is S.",
            "I am single.", "My name is KG.",
            "I lovE cinema.", "GeeksQuiz. is a quiz site.",
            "I love Geeksquiz and Geeksforgeeks.",
            "  You are my friend.", "I love cinema"]
string_size = len(string)
for i in range(string_size):
    if checkSentence(string[i]):
        print ("\"" +  string[i] + "\" is correct")
    else:
        print ("\"" + string[i] + "\" is incorrect")
 
# This code is contributed by BHAVYA JAIN


C#




// C# program to validate a given sentence
// for a set of rules
using System;
 
class GFG
{
 
    // Method to check a given sentence for given rules
    static bool checkSentence(char[] str)
    {
 
        // Calculate the length of the string.
        int len = str.Length;
 
        // Check that the first character lies in [A-Z].
        // Otherwise return false.
        if (str[0] < 'A' || str[0] > 'Z')
            return false;
 
        // If the last character is not a full stop(.)
        // no need to check further.
        if (str[len - 1] != '.')
            return false;
 
        // Maintain 2 states. Previous and current state
        // based on which vertex state you are.
        // Initialise both with 0 = start state.
        int prev_state = 0, curr_state = 0;
 
        // Keep the index to the next character in the string.
        int index = 1;
 
        // Loop to go over the string.
        while (index <= str.Length)
        {
 
            // Set states according to the input characters
            // in the string and the rule defined in the description.
            // If current character is [A-Z]. Set current state as 0.
            if (str[index] >= 'A' && str[index] <= 'Z')
                curr_state = 0;
 
            // If current character is a space.
            // Set current state as 1.
            else if (str[index] == ' ')
                curr_state = 1;
 
            // If current character is [a-z].
            // Set current state as 2.
            else if (str[index] >= 'a' && str[index] <= 'z')
                curr_state = 2;
 
            // If current state is a dot(.).
            // Set current state as 3.
            else if (str[index] == '.')
                curr_state = 3;
 
            // Validates all current state with previous state
            // for the rules in the description of the problem.
            if (prev_state == curr_state && curr_state != 2)
                return false;
                 
            if (prev_state == 2 && curr_state == 0)
                return false;
 
            // If we have reached last state and previous state
            // is not 1, then check next character. If next character
            // is '\0', then return true, else false
            if (curr_state == 3 && prev_state != 1)
                return (index + 1 == str.Length);
 
            index++;
 
            // Set previous state as current state
            // before going over to the next character.
            prev_state = curr_state;
        }
        return false;
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        String[] str = { "I love cinema.", "The vertex is S.",
                        "I am single.", "My name is KG.",
                        "I lovE cinema.", "GeeksQuiz. is a quiz site.",
                        "I love Geeksquiz and Geeksforgeeks.",
                        " You are my friend.", "I love cinema" };
        int str_size = str.Length;
 
        int i = 0;
        for (i = 0; i < str_size; i++)
        {
            if (checkSentence(str[i].ToCharArray()))
                Console.WriteLine("\"" + str[i] +
                                "\"" + " is correct");
            else
                Console.WriteLine("\"" + str[i] +
                                "\"" + " is incorrect");
        }
    }
}
 
// This code is contributed by 29AjayKumar


Javascript




<script>
      // JavaScript program to validate a given sentence
      // for a set of rules
      // Method to check a given sentence for given rules
      function checkSentence(str) {
        // Calculate the length of the string.
        var len = str.length;
 
        // Check that the first character lies in [A-Z].
        // Otherwise return false.
        if (
          str[0].charCodeAt(0) < "A".charCodeAt(0) ||
          str[0].charCodeAt(0) > "Z".charCodeAt(0)
        )
          return false;
 
        // If the last character is not a full stop(.)
        // no need to check further.
        if (str[len - 1] !== ".") return false;
 
        // Maintain 2 states. Previous and current state
        // based on which vertex state you are.
        // Initialise both with 0 = start state.
        var prev_state = 0,
          curr_state = 0;
 
        // Keep the index to the next character in the string.
        var index = 1;
 
        // Loop to go over the string.
        while (index <= str.length) {
          // Set states according to the input characters
          // in the string and the rule defined in the description.
          // If current character is [A-Z]. Set current state as 0.
          if (
            str[index].charCodeAt(0) >= "A".charCodeAt(0) &&
            str[index].charCodeAt(0) <= "Z".charCodeAt(0)
          )
            curr_state = 0;
          // If current character is a space.
          // Set current state as 1.
          else if (str[index] === " ") curr_state = 1;
          // If current character is [a-z].
          // Set current state as 2.
          else if (
            str[index].charCodeAt(0) >= "a".charCodeAt(0) &&
            str[index].charCodeAt(0) <= "z".charCodeAt(0)
          )
            curr_state = 2;
          // If current state is a dot(.).
          // Set current state as 3.
          else if (str[index] === ".") curr_state = 3;
 
          // Validates all current state with previous state
          // for the rules in the description of the problem.
          if (prev_state === curr_state && curr_state !== 2) return false;
 
          if (prev_state === 2 && curr_state === 0) return false;
 
          // If we have reached last state and previous state
          // is not 1, then check next character. If next character
          // is '\0', then return true, else false
          if (curr_state === 3 && prev_state !== 1)
            return index + 1 == str.length;
 
          index++;
 
          // Set previous state as current state
          // before going over to the next character.
          prev_state = curr_state;
        }
        return false;
      }
 
      // Driver Code
      var str = [
        "I love cinema.",
        "The vertex is S.",
        "I am single.",
        "My name is KG.",
        "I lovE cinema.",
        "GeeksQuiz. is a quiz site.",
        "I love Geeksquiz and Geeksforgeeks.",
        " You are my friend.",
        "I love cinema",
      ];
      var str_size = str.length;
 
      var i = 0;
      for (i = 0; i < str_size; i++) {
        var temp = str[i].split("");
        if (checkSentence(temp))
          document.write('"' + str[i] + '"' + " is correct" + "<br>");
        else document.write('"' + str[i] + '"' + " is incorrect" + "<br>");
      }
    </script>


Output

"I love cinema." is correct 
"The vertex is S." is correct 
"I am single." is correct 
"My name is KG." is incorrect 
"I lovE cinema." is incorrect 
"GeeksQuiz. is a quiz site." is incorrect 
"I love Geeksquiz and Geeksforgeeks." is correct 
"  You are my friend." is incorrect 
"I love cinema" is incorrect 

Time complexity – O(n), worst case as we have to traverse the full sentence where n is the length of the sentence. 
Auxiliary space – O(1)

 



Last Updated : 08 Jul, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads