📌  相关文章
📜  从S删除子字符串以使所有剩余字符都相同的方式的数量

📅  最后修改于: 2021-06-25 09:54:36             🧑  作者: Mango

给定一个仅由小写英文字母组成的字符串str ,任务是计算从str中准确删除一个子字符串的方式数量,以使所有其余字符都相同。
注意: str中至少有两个不同的字符,我们也可以删除整个字符串。

例子:

方法:

  • 将字符串中相同字符的前缀后缀长度存储在变量count_leftcount_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