计算字符串 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
。我遵循的步骤
- 记录我找到了多少
B
,直到找到一个 'A'。
- 如果找到
A
则将 B Count
添加到主 output
并为下一次连续搜索重置值。
- 如果
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 连续。
问题陈述
给你一串字符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
。我遵循的步骤
- 记录我找到了多少
B
,直到找到一个 'A'。 - 如果找到
A
则将B Count
添加到主output
并为下一次连续搜索重置值。 - 如果
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 连续。