Check a given sentence for a given set of simple grammar rules
A simple sentence if syntactically correct if it fulfills given rules. The following are given rules.
- Sentence must start with a Uppercase character (e.g. Noun/ I/ We/ He etc.)
- Then lowercase character follows.
- There must be spaces between words.
- Then the sentence must end with a full stop(.) after a word.
- Two continuous spaces are not allowed.
- 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:
- 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.
- For rest of the string, this problem could be solved by following a state diagram. Please refer to the below state diagram for that.
- 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> |
"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)
This article is contributed by Kumar Gautam. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.