Number of ways to remove a sub-string from S such that all remaining characters are same
Last Updated :
13 Sep, 2022
Given a string str consisting only of lowercase English alphabets, the task is to count the number of ways to remove exactly one sub-string from str such that all remaining characters are same.
Note: There are at least two different characters in str and we can remove the whole string as well.
Examples:
Input: str = “abaa”
Output: 6
We can remove the following sub-strings to satisfy the given condition:
str[0:1], str[0:2], str[0:3], str[1:1], str[1:2] and str[1:3]
Input: str = “geeksforgeeks”
Output: 3
We remove complete string.
We remove all except first.
We remove all except last
Approach:
- Store the length of prefix and suffix of same characters from the string in variables count_left and count_right.
- It is obvious that this prefix and suffix wouldn’t overlap, since there are at least two different characters in str.
- Now there are 2 cases:
- When str[0] = str[n – 1] then every character of the prefix (including the character just after the prefix ends) will act as the starting character of the sub-string and every character of the suffix (including the character just before the suffix starts) will act as the ending character of the sub-string. So, total valid sub-strings will be count = (count_left + 1) * (count_right + 1).
- When str[0] != str[n – 1]. then count = count_left + count_right + 1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int no_of_ways(string s)
{
int n = s.length();
int count_left = 0, count_right = 0;
for ( int i = 0; i < n; ++i) {
if (s[i] == s[0]) {
++count_left;
}
else
break ;
}
for ( int i = n - 1; i >= 0; --i) {
if (s[i] == s[n - 1]) {
++count_right;
}
else
break ;
}
if (s[0] == s[n - 1])
return ((count_left + 1) * (count_right + 1));
else
return (count_left + count_right + 1);
}
int main()
{
string s = "geeksforgeeks" ;
cout << no_of_ways(s);
return 0;
}
|
Java
import java.util.*;
class solution
{
static int no_of_ways(String s)
{
int n = s.length();
int count_left = 0 , count_right = 0 ;
for ( int i = 0 ; i < n; ++i) {
if (s.charAt(i) == s.charAt( 0 )) {
++count_left;
}
else
break ;
}
for ( int i = n - 1 ; i >= 0 ; --i) {
if (s.charAt(i) == s.charAt(n - 1 )) {
++count_right;
}
else
break ;
}
if (s.charAt( 0 ) == s.charAt(n - 1 ))
return ((count_left + 1 ) * (count_right + 1 ));
else
return (count_left + count_right + 1 );
}
public static void main(String args[])
{
String s = "geeksforgeeks" ;
System.out.println(no_of_ways(s));
}
}
|
Python3
def no_of_ways(s):
n = len (s)
count_left = 0
count_right = 0
for i in range ( 0 , n, 1 ):
if (s[i] = = s[ 0 ]):
count_left + = 1
else :
break
i = n - 1
while (i > = 0 ):
if (s[i] = = s[n - 1 ]):
count_right + = 1
else :
break
i - = 1
if (s[ 0 ] = = s[n - 1 ]):
return ((count_left + 1 ) *
(count_right + 1 ))
else :
return (count_left + count_right + 1 )
if __name__ = = '__main__' :
s = "geeksforgeeks"
print (no_of_ways(s))
|
C#
using System;
class GFG
{
static int no_of_ways( string s)
{
int n = s.Length;
int count_left = 0, count_right = 0;
for ( int i = 0; i < n; ++i)
{
if (s[i] == s[0])
{
++count_left;
}
else
break ;
}
for ( int i = n - 1; i >= 0; --i)
{
if (s[i] == s[n - 1])
{
++count_right;
}
else
break ;
}
if (s[0] == s[n - 1])
return ((count_left + 1) *
(count_right + 1));
else
return (count_left + count_right + 1);
}
public static void Main()
{
string s = "geeksforgeeks" ;
Console.WriteLine(no_of_ways(s));
}
}
|
PHP
<?php
function no_of_ways( $s )
{
$n = strlen ( $s );
$count_left = 0;
$count_right = 0;
for ( $i = 0; $i < $n ; ++ $i )
{
if ( $s [ $i ] == $s [0])
{
++ $count_left ;
}
else
break ;
}
for ( $i = $n - 1; $i >= 0; -- $i )
{
if ( $s [ $i ] == $s [ $n - 1])
{
++ $count_right ;
}
else
break ;
}
if ( $s [0] == $s [ $n - 1])
return (( $count_left + 1) *
( $count_right + 1));
else
return ( $count_left + $count_right + 1);
}
$s = "geeksforgeeks" ;
echo no_of_ways( $s );
?>
|
Javascript
<script>
function no_of_ways(s)
{
let n = s.length;
let count_left = 0, count_right = 0;
for (let i = 0; i < n; ++i)
{
if (s[i] == s[0])
{
++count_left;
}
else
break ;
}
for (let i = n - 1; i >= 0; --i)
{
if (s[i] == s[n - 1])
{
++count_right;
}
else
break ;
}
if (s[0] == s[n - 1])
return ((count_left + 1) *
(count_right + 1));
else
return (count_left + count_right + 1);
}
let s = "geeksforgeeks" ;
document.write(no_of_ways(s));
</script>
|
Complexity Analysis:
- Time Complexity: O(n), where n is the size of the given string
- Auxiliary Space: O(1), as no extra space is required
Share your thoughts in the comments
Please Login to comment...