给定一个仅由小写英文字母组成的字符串str ,任务是计算从str中准确删除一个子字符串的方式数量,以使所有其余字符都相同。
注意: str中至少有两个不同的字符,我们也可以删除整个字符串。
例子:
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
方法:
- 将字符串中相同字符的前缀和后缀的长度存储在变量count_left和count_right中。
- 显然,该前缀和后缀不会重叠,因为str中至少有两个不同的字符。
- 现在有两种情况:
- 当str [0] = str [n – 1]时,前缀的每个字符(包括紧跟在前缀末尾的字符)将充当子字符串的起始字符和后缀的每个字符(包括正则字符)在后缀开始之前)将用作子字符串的结束字符。因此,总有效子字符串将为count =(count_left +1)*(count_right +1) 。
- 当str [0]!= str [n – 1]时。然后count = count_left + count_right + 1 。
下面是上述方法的实现:
C++
// C++ program to count number of ways of
// removing a substring from a string such
// that all remaining characters are equal
#include
using namespace std;
// Function to return the number of ways
// of removing a sub-string from s such
// that all the remaining characters are same
int no_of_ways(string s)
{
int n = s.length();
// To store the count of prefix and suffix
int count_left = 0, count_right = 0;
// Loop to count prefix
for (int i = 0; i < n; ++i) {
if (s[i] == s[0]) {
++count_left;
}
else
break;
}
// Loop to count suffix
for (int i = n - 1; i >= 0; --i) {
if (s[i] == s[n - 1]) {
++count_right;
}
else
break;
}
// First and last characters of the
// string are same
if (s[0] == s[n - 1])
return ((count_left + 1) * (count_right + 1));
// Otherwise
else
return (count_left + count_right + 1);
}
// Driver function
int main()
{
string s = "geeksforgeeks";
cout << no_of_ways(s);
return 0;
}
Java
// Java program to count number of ways of
// removing a substring from a string such
// that all remaining characters are equal
import java.util.*;
class solution
{
// Function to return the number of ways
// of removing a sub-string from s such
// that all the remaining characters are same
static int no_of_ways(String s)
{
int n = s.length();
// To store the count of prefix and suffix
int count_left = 0, count_right = 0;
// Loop to count prefix
for (int i = 0; i < n; ++i) {
if (s.charAt(i) == s.charAt(0)) {
++count_left;
}
else
break;
}
// Loop to count suffix
for (int i = n - 1; i >= 0; --i) {
if (s.charAt(i) == s.charAt(n - 1)) {
++count_right;
}
else
break;
}
// First and last characters of the
// string are same
if (s.charAt(0) == s.charAt(n - 1))
return ((count_left + 1) * (count_right + 1));
// Otherwise
else
return (count_left + count_right + 1);
}
// Driver function
public static void main(String args[])
{
String s = "geeksforgeeks";
System.out.println(no_of_ways(s));
}
}
Python3
# Python 3 program to count number of
# ways of removing a substring from a
# string such that all remaining
# characters are equal
# Function to return the number of
# ways of removing a sub-string from
# s such that all the remaining
# characters are same
def no_of_ways(s):
n = len(s)
# To store the count of
# prefix and suffix
count_left = 0
count_right = 0
# Loop to count prefix
for i in range(0, n, 1):
if (s[i] == s[0]):
count_left += 1
else:
break
# Loop to count suffix
i = n - 1
while(i >= 0):
if (s[i] == s[n - 1]):
count_right += 1
else:
break
i -= 1
# First and last characters of
# the string are same
if (s[0] == s[n - 1]):
return ((count_left + 1) *
(count_right + 1))
# Otherwise
else:
return (count_left + count_right + 1)
# Driver Code
if __name__ == '__main__':
s = "geeksforgeeks"
print(no_of_ways(s))
# This code is contributed by
# Sahil_shelengia
C#
// C# program to count number of ways of
// removing a substring from a string such
// that all remaining characters are equal
using System;
class GFG
{
// Function to return the number of ways
// of removing a sub-string from s such
// that all the remaining characters are same
static int no_of_ways(string s)
{
int n = s.Length;
// To store the count of prefix and suffix
int count_left = 0, count_right = 0;
// Loop to count prefix
for (int i = 0; i < n; ++i)
{
if (s[i] == s[0])
{
++count_left;
}
else
break;
}
// Loop to count suffix
for (int i = n - 1; i >= 0; --i)
{
if (s[i] == s[n - 1])
{
++count_right;
}
else
break;
}
// First and last characters of the
// string are same
if (s[0] == s[n - 1])
return ((count_left + 1) *
(count_right + 1));
// Otherwise
else
return (count_left + count_right + 1);
}
// Driver Code
public static void Main()
{
string s = "geeksforgeeks";
Console.WriteLine(no_of_ways(s));
}
}
// This code is contributed
// by Akanksha Rai
PHP
= 0; --$i)
{
if ($s[$i] == $s[$n - 1])
{
++$count_right;
}
else
break;
}
// First and last characters of the
// string are same
if ($s[0] == $s[$n - 1])
return (($count_left + 1) *
($count_right + 1));
// Otherwise
else
return ($count_left + $count_right + 1);
}
// Driver Code
$s = "geeksforgeeks";
echo no_of_ways($s);
// This code is contributed by ihritik
?>
输出:
3