计算字符串 S 中 'B' 的出现次数,前提是所有 A 都在一起

Count the occurence of 'B' in a String S, provided all A's are together

问题陈述

给你一串字符A和B 你希望所有的 A 都在一起, 为此,您可以从字符串中删除一些 B, 为达到此目的,您至少可以删除多少个 B

输入 :: 第一个也是唯一的参数是字符串 A

输出 :: Return 一个整数,等于您必须删除的 B 的最小数量。

Example String s1 =  "AAABA"      SOP(" output=1B is to be deleted, ")
Example String s2 =  "AAAAB"      SOP(" output=0B is to be deleted, All A's are together.");
Example String s3 =  "AAABBBBA "  SOP(" output= 4B is to be deleted")
Example String s4 =  "AAAAAAAAAB" SOP(" output =0B is to be deleted,All A's are together")

我已经实现了这个partialy,但是你能指出来吗 我哪里错了

算法的初步分析 :: 我正在迭代字符串 s1,我试图找到 lastCharacter 等于 'A' 的位置,我试图找到B的位置并增加输出,因此保持输出计数然后显示显示错误结果的结果。我哪里错了?你能给我一些指导来达到问题陈述中所述的预期结果吗

给你兄弟

package app;

import java.util.*;

public class Main {
    public static void main(String args[]) {
        String s1 = "AAABA";
        int neededToDelete = 0;
        int subIndexToDeleteTo = s1.length();
        for (int i = s1.length() - 1; i >= 0; --i) {
            if (Objects.equals('B', s1.charAt(i)) && s1.substring(0, i).contains("A") &&
            s1.substring(i, subIndexToDeleteTo).contains("B") && i != s1.length()-1) {
                neededToDelete++;
                subIndexToDeleteTo  = i;
            }
        }
        System.out.println(neededToDelete);
    }
}

想法是连续计算 B,直到找到 A。我遵循的步骤

  1. 记录我找到了多少 B,直到找到一个 'A'。
  2. 如果找到 A 则将 B Count 添加到主 output 并为下一次连续搜索重置值。
  3. 如果 A 未找到,则只需丢弃 B Count 跟踪器。
//Removing the first and last unnecessary B
String s1 = "BBBAAAABBBBAABB";
s1= s1.substring(s1.indexOf("A"),s1.lastIndexOf("A"));

int output=0;
int bFound=0;
for (int i = 0; i < s1.length(); i++) {
  if(s1.charAt(i)=='B'){
    System.out.println("B Found");
    bFound++;
  }else if(bFound>0 && s1.charAt(i)=='A'){
    output+=bFound; //adding to main output plus resetting the count  
    bFound=0;
  }
}

System.out.println("Total B to remove: "+output);
if(output>0){
  // your print statement
}else{
  // your print statement
}

这可能太高级了,您无法理解,但您可以像这样用一行就可以得到计数

String s1= "BBBABAABBBBABB"; // output 5          
long count = Pattern.compile("(?<=(A.{0,100}))B(?=(.*A))").matcher(s1).results().count();
if(count > 0){
    System.out.println(" B output is " + count);
} else{
    System.out.println(" All A's are together,hence  B output is :: " + count);
}

它使用一个正则表达式,通过使用前瞻和后视来匹配在它之前和之后的某个时间点有一个 A 的所有 B。 100 是一个任意数字,应该等于或大于预期字符串的最大长度。

简单的解决方案:从左侧和右侧移除单独的 B。然后数中间的B。

    public static int minDeletion(String s){
        int counter = 0;
        int left = 0;
        int right = s.length()-1;
        while(true){
            if(s.charAt(left)=='B') left++;
            if(s.charAt(right)=='B') right--;
            if(s.charAt(left)!='B' && s.charAt(right)!='B') break;
        }
        for(int i=left; i<=right; i++){
            if(s.charAt(i)=='B') counter++;
        }
        return counter;
    }

分配两个指针,一个从左边开始,一个从右边开始。 left 将向右移动,right 将向左移动,直到在两者中都找到 A。之后,计算该部分中的 B,因为必须删除它们才能使所有 A 连续。