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++ 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 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 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 |
# 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# 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 |
<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)