📜  以任何顺序连接字符串以获得“ AB”的最大数量

📅  最后修改于: 2021-05-04 07:00:37             🧑  作者: Mango

给定一个长度为N的字符串数组,可以以任何顺序将它们连接起来。在结果字符串找到“ AB”的最大可能出现次数。

例子:

方法:
预先计算每个字符串中的AB数。集中讨论跨越两个字符串时,字符串被重新安排ABS的数量的变化。在每个字符串重要的字符只有它的第一个和最后一个字符。

可能有助于答案的字符串是:

  1. 以B开头并以A字符串。
  2. 以B开头但不以A结尾的字符串。
  3. 一个不以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