给定一个长度为N的字符串数组,可以以任何顺序将它们连接起来。在结果字符串找到“ AB”的最大可能出现次数。
例子:
Input : N = 4, arr={ “BCA”, “BGGGA”, “JKA”, “BALB” }
Output : 3
Concatenate them in the order JKA + BGGA + BCA + BALB and it will become JKABGGABCABALB and it has3 occurrences of ‘AB’.
Input : N = 3, arr={ “ABCA”, “BOOK”, “BAND” }
Output : 3
方法:
预先计算每个字符串中的AB数。集中讨论跨越两个字符串时,字符串被重新安排ABS的数量的变化。在每个字符串重要的字符只有它的第一个和最后一个字符。
可能有助于答案的字符串是:
- 以B开头并以A字符串。
- 以B开头但不以A结尾的字符串。
- 一个不以B开头但以A字符串。
令c1,c2和c3分别为类别1、2和3的字符串数。
- 如果c1 = 0,则答案为min(c2,c3),因为我们可以同时使用两者,并且只要两者均可用,则将其串联。
- 如果c1> 0且c2 + c3 = 0,则答案是c1 – 1,因为我们串联在一起,然后依次串联。
- 如果c1> 0且c2 + c3> 0并取min(c2,c3)= p,则首先将类别1字符串一个接一个地连接,再加上额外的c1 – 1’AB’,然后如果类别2和3都可用,则添加类别3在当前结果字符串的开头,并在当前结果字符串的末尾添加类别2。
- 有c1 – 1 + 2 = c1 + 1个额外的“ AB”,现在c2和c3减少1,而p变成p – 1,现在取两者
类别2和3并添加它们(只要它们都可用),现在我们就得到总c1 +1 +(p – 1)= c1 + p额外的“ AB”,这意味着c1 + min(c2,c3)。
下面是上述方法的实现:
C++
// C++ implementation of above approach
#include
using namespace std;
// Function to find maximum number of ABs
int maxCountAB(string s[], int n)
{
// variable A, B, AB for count strings that
// end with 'A' but not end with 'B', 'B' but
// does not end with 'A' and 'B' and ends
// with 'A' respectively.
int A = 0, B = 0, BA = 0, ans = 0;
for (int i = 0; i < n; i++) {
string S = s[i];
int L = S.size();
for (int j = 0; j < L - 1; j++) {
// 'AB' is already present in string
// before concatenate them
if (S.at(j) == 'A' &&
S.at(j + 1) == 'B') {
ans++;
}
}
// count of strings that begins
// with 'B' and ends with 'A
if (S.at(0) == 'B' && S.at(L - 1) == 'A')
BA++;
// count of strings that begins
// with 'B' but does not end with 'A'
else if (S.at(0) == 'B')
B++;
// count of strings that ends with
// 'A' but not end with 'B'
else if (S.at(L - 1) == 'A')
A++;
}
// updating the value of ans and
// add extra count of 'AB'
if (BA == 0)
ans += min(B, A);
else if (A + B == 0)
ans += BA - 1;
else
ans += BA + min(B, A);
return ans;
}
// Driver Code
int main()
{
string s[] = { "ABCA", "BOOK", "BAND" };
int n = sizeof(s) / sizeof(s[0]);
cout << maxCountAB(s, n);
return 0;
}
Java
// Java implementation of above approach
import java.util.*;
class GFG
{
// Function to find maximum number of ABs
static int maxCountAB(String s[], int n)
{
// variable A, B, AB for count strings that
// end with 'A' but not end with 'B', 'B' but
// does not end with 'A' and 'B' and ends
// with 'A' respectively.
int A = 0, B = 0, BA = 0, ans = 0;
for (int i = 0; i < n; i++)
{
String S = s[i];
int L = S.length();
for (int j = 0; j < L - 1; j++)
{
// 'AB' is already present in string
// before concatenate them
if (S.charAt(j) == 'A' &&
S.charAt(j + 1) == 'B')
{
ans++;
}
}
// count of strings that begins
// with 'B' and ends with 'A
if (S.charAt(0) == 'B' && S.charAt(L - 1) == 'A')
BA++;
// count of strings that begins
// with 'B' but does not end with 'A'
else if (S.charAt(0) == 'B')
B++;
// count of strings that ends with
// 'A' but not end with 'B'
else if (S.charAt(L - 1) == 'A')
A++;
}
// updating the value of ans and
// add extra count of 'AB'
if (BA == 0)
ans += Math.min(B, A);
else if (A + B == 0)
ans += BA - 1;
else
ans += BA + Math.min(B, A);
return ans;
}
// Driver Code
public static void main(String[] args)
{
String s[] = { "ABCA", "BOOK", "BAND" };
int n = s.length;
System.out.println(maxCountAB(s, n));
}
}
// This code is contributed by 29AjayKumar
Python3
# Python 3 implementation of above approach
# Function to find maximum number of ABs
def maxCountAB(s,n):
# variable A, B, AB for count strings that
# end with 'A' but not end with 'B', 'B' but
# does not end with 'A' and 'B' and ends
# with 'A' respectively.
A = 0
B = 0
BA = 0
ans = 0
for i in range(n):
S = s[i]
L = len(S)
for j in range(L-1):
# 'AB' is already present in string
# before concatenate them
if (S[j] == 'A' and S[j + 1] == 'B'):
ans += 1
# count of strings that begins
# with 'B' and ends with 'A
if (S[0] == 'B' and S[L - 1] == 'A'):
BA += 1
# count of strings that begins
# with 'B' but does not end with 'A'
elif (S[0] == 'B'):
B += 1
# count of strings that ends with
# 'A' but not end with 'B'
elif (S[L - 1] == 'A'):
A += 1
# updating the value of ans and
# add extra count of 'AB'
if (BA == 0):
ans += min(B, A)
elif (A + B == 0):
ans += BA - 1
else:
ans += BA + min(B, A)
return ans
# Driver Code
if __name__ == '__main__':
s = ["ABCA", "BOOK", "BAND"]
n = len(s)
print(maxCountAB(s, n))
# This code is contributed by
# Surendra_Gangwar
C#
// C# implementation of above approach
using System;
class GFG
{
// Function to find maximum number of ABs
static int maxCountAB(string []s, int n)
{
// variable A, B, AB for count strings that
// end with 'A' but not end with 'B', 'B' but
// does not end with 'A' and 'B' and ends
// with 'A' respectively.
int A = 0, B = 0, BA = 0, ans = 0;
for (int i = 0; i < n; i++)
{
string S = s[i];
int L = S.Length;
for (int j = 0; j < L - 1; j++)
{
// 'AB' is already present in string
// before concatenate them
if (S[j] == 'A' &&
S[j + 1] == 'B')
{
ans++;
}
}
// count of strings that begins
// with 'B' and ends with 'A
if (S[0] == 'B' && S[L - 1] == 'A')
BA++;
// count of strings that begins
// with 'B' but does not end with 'A'
else if (S[0] == 'B')
B++;
// count of strings that ends with
// 'A' but not end with 'B'
else if (S[L - 1] == 'A')
A++;
}
// updating the value of ans and
// add extra count of 'AB'
if (BA == 0)
ans += Math.Min(B, A);
else if (A + B == 0)
ans += BA - 1;
else
ans += BA + Math.Min(B, A);
return ans;
}
// Driver Code
public static void Main()
{
string []s = { "ABCA", "BOOK", "BAND" };
int n = s.Length;
Console.WriteLine(maxCountAB(s, n));
}
}
// This code is contributed by AnkitRai01
输出:
2