给定二进制字符串str ,任务是计算给定字符串str的子字符串数,以使子字符串的每个字符都属于长度至少为2的回文子字符串。
例子:
Input: S = “00111”
Output: 6
Explanation:
There are 6 such substrings in the given string such that each character belongs to a palindrome of size greater than 1 as {“00”, “0011”, “00111”, “11”, “111”, “11”}
Input: S = “0001011”
Output: 15
方法:想法是对每个字符都不属于回文子字符串的子字符串进行计数,然后从大小大于1的字符串的可能子字符串总数中减去此计数。以下是步骤说明:
- 可以观察到,如果我们将子字符串a 2 a 3 ….a k-1 (即没有开始和结束字符)作为子字符串,则它的每个字符可能属于某个回文。
证明:If ai == ai-1 or ai == ai+1, Then it belongs to a palindrome of length 2. Otherwise, If ai != ai-1, ai != ai+1 and ai+1 == ai-1, Then, It belongs to a palindrome of size 3.
- 因此,存在四种子字符串模式,其中每个字符都不属于回文式:
- “ 0111….11”
- “ 100…..00”
- “ 111….110”
- “ 000….001”
- 最后,从可能长度大于1的子字符串总数中减去此计数。
Count = (N*(N – 1)/2) – (Count of the substrings in which each character doesn’t belongs to palindrome)
下面是上述方法的实现:
C++
// C++ implementation to find the
// substrings in binary string
// such that every character
// belongs to a palindrome
#include
using namespace std;
// Function to to find the
// substrings in binary string
// such that every character
// belongs to a palindrome
int countSubstrings(string s)
{
int n = s.length();
// Total substrings
int answer = (n * (n - 1)) / 2;
int cnt = 1;
vector v;
// Loop to store the count of
// continious characters in
// the given string
for (int i = 1; i < n; i++) {
if (s[i] == s[i - 1])
cnt++;
else {
v.push_back(cnt);
cnt = 1;
}
}
if (cnt > 0)
v.push_back(cnt);
// Subtract non special
// strings from answer
for (int i = 0;
i < v.size() - 1; i++) {
answer -= (v[i]
+ v[i + 1]
- 1);
}
return answer;
}
// Driver Code
int main()
{
// Given string s
string s = "00111";
// Function Call
cout << countSubstrings(s);
return 0;
}
Java
// Java implementation to find the
// substrings in binary string
// such that every character
// belongs to a palindrome
import java.util.*;
class GFG{
// Function to to find the
// substrings in binary string
// such that every character
// belongs to a palindrome
public static int countSubstrings(String s)
{
int n = s.length();
// Total substrings
int answer = (n * (n - 1)) / 2;
int cnt = 1;
Vector v = new Vector();
// Loop to store the count of
// continious characters in
// the given string
for(int i = 1; i < n; i++)
{
if (s.charAt(i) == s.charAt(i - 1))
cnt++;
else
{
v.add(cnt);
cnt = 1;
}
}
if (cnt > 0)
v.add(cnt);
// Subtract non special
// strings from answer
for(int i = 0; i < v.size() - 1; i++)
{
answer -= (v.get(i) +
v.get(i + 1) - 1);
}
return answer;
}
// Driver code
public static void main(String[] args)
{
// Given string s
String s = "00111";
// Function call
System.out.print(countSubstrings(s));
}
}
// This code is contributed by divyeshrabadiya07
Python3
# Python3 implementation to find the
# substrings in binary string
# such that every character
# belongs to a palindrome
# Function to find the substrings in
# binary string such that every
# character belongs to a palindrome
def countSubstrings (s):
n = len(s)
# Total substrings
answer = (n * (n - 1)) // 2
cnt = 1
v = []
# Loop to store the count
# of continuous characters
# in the given string
for i in range(1, n):
if (s[i] == s[i - 1]):
cnt += 1
else:
v.append(cnt)
cnt = 1
if (cnt > 0):
v.append(cnt)
# Subtract non special strings
# from answer
for i in range(len(v) - 1):
answer -= (v[i] + v[i + 1] - 1)
return answer
# Driver Code
if __name__ == '__main__':
# Given string
s = "00111"
# Function call
print(countSubstrings(s))
# This code is contributed by himanshu77
C#
// C# implementation to find the
// substrings in binary string
// such that every character
// belongs to a palindrome
using System;
using System.Collections.Generic;
class GFG{
// Function to to find the
// substrings in binary string
// such that every character
// belongs to a palindrome
public static int countSubstrings(String s)
{
int n = s.Length;
// Total substrings
int answer = (n * (n - 1)) / 2;
int cnt = 1;
List v = new List();
// Loop to store the count of
// continious characters in
// the given string
for(int i = 1; i < n; i++)
{
if (s[i] == s[i-1])
cnt++;
else
{
v.Add(cnt);
cnt = 1;
}
}
if (cnt > 0)
v.Add(cnt);
// Subtract non special
// strings from answer
for(int i = 0; i < v.Count - 1; i++)
{
answer -= (v[i] +
v[i + 1] - 1);
}
return answer;
}
// Driver code
public static void Main(String[] args)
{
// Given string s
String s = "00111";
// Function call
Console.Write(countSubstrings(s));
}
}
// This code contributed by sapnasingh4991
输出:
6
时间复杂度: O(N)
辅助空间: O(N)