Java 减少字符串

Java 减少字符串,java,string,stringbuilder,Java,String,Stringbuilder,我在解决一个问题,把形式简化为不可简化形式。这就是问题所在 Shil有一个字符串S,由N个小写英文字母组成。在一次操作中,他可以删除任何具有相同值的相邻字母对。例如,字符串“aabcc”在操作后将变为“aab”或“bcc” Shil希望尽可能减少S。为此,他将尽可能多次重复上述操作。通过查找和打印不可还原的形式来帮助您摆脱困境 如果最后一个字符串为空,则打印空字符串;否则,打印最后的不可还原字符串 样本输入0 aaabccddd 样本输出0 abd 样本输入1 baab 样本输出1 空字符串 样

我在解决一个问题,把形式简化为不可简化形式。这就是问题所在

Shil有一个字符串S,由N个小写英文字母组成。在一次操作中,他可以删除任何具有相同值的相邻字母对。例如,字符串“aabcc”在操作后将变为“aab”或“bcc”

Shil希望尽可能减少S。为此,他将尽可能多次重复上述操作。通过查找和打印不可还原的形式来帮助您摆脱困境

如果最后一个字符串为空,则打印空字符串;否则,打印最后的不可还原字符串

样本输入0

aaabccddd

样本输出0

abd

样本输入1

baab

样本输出1

空字符串

样本输入2

aa

样本输出2

空字符串

解释

示例案例0: Shil可以执行以下操作序列以获取最终字符串:

因此,我们印刷

示例案例1: Shil可以执行以下操作序列以获取最终字符串: aaabccddd->abccddd

abccddd->abddd

abdd->abd

因此,我们打印abd

示例案例1: baab->bb

bb->空字符串。

到目前为止,我所做的是尝试通过Java中的StringBuilder来解决这个问题。但是有些测试用例通过了,而另一些测试用例没有通过,我无法找出错误是什么

这是我迄今为止尝试过的代码

import java.util.Scanner;
公共类解决方案{
公共静态void main(字符串[]args){
扫描仪扫描=新扫描仪(System.in);
StringBuilder sb=新的StringBuilder(scan.nextLine());
对于(int i=0;i
}

输入,如aaabccddd


aa通过。但当输入为baab时失败。

问题是您只需在字符串中运行一次循环。 例如: 字符串“baab”,您只需删除“aa”并完成循环

解决方案:使用带有标志isNonReducible的递归,循环直到它给出空字符串或标志isNonReducible=true

public class Solution {
public static StringBuilder checkReducible(StringBuilder sb) {
    boolean isNonReducible = true;
    for (int i = 0; i < sb.length() - 1; i++) {
        if (sb.charAt(i) == sb.charAt(i + 1)) {
            isNonReducible = false;
            sb.delete(i, i + 2);    
        }
    }
    if (sb.length() == 0) {
        return new StringBuilder("Empty String");
    }
    else {
        if(!isNonReducible) {
            sb = checkReducible(sb);
        }
        return sb; 
    }
}

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    StringBuilder sb = new StringBuilder(scan.nextLine());
    System.out.println(checkReducible(sb));
    scan.close();
}
}
公共类解决方案{
公共静态StringBuilder可检查还原(StringBuilder sb){
布尔不可约=真;
对于(int i=0;i
问题是您只需在字符串中运行一次循环。 例如: 字符串“baab”,您只需删除“aa”并完成循环

解决方案:使用带有标志isNonReducible的递归,循环直到它给出空字符串或标志isNonReducible=true

public class Solution {
public static StringBuilder checkReducible(StringBuilder sb) {
    boolean isNonReducible = true;
    for (int i = 0; i < sb.length() - 1; i++) {
        if (sb.charAt(i) == sb.charAt(i + 1)) {
            isNonReducible = false;
            sb.delete(i, i + 2);    
        }
    }
    if (sb.length() == 0) {
        return new StringBuilder("Empty String");
    }
    else {
        if(!isNonReducible) {
            sb = checkReducible(sb);
        }
        return sb; 
    }
}

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    StringBuilder sb = new StringBuilder(scan.nextLine());
    System.out.println(checkReducible(sb));
    scan.close();
}
}
公共类解决方案{
公共静态StringBuilder可检查还原(StringBuilder sb){
布尔不可约=真;
对于(int i=0;i
您必须使用while循环。您的代码的问题是它只在代码中迭代一次。在第一次迭代中,虽然您的输入“baab”变为“bb”,但它会检查第二个b,并尝试在i+1中找到一个“b”(它不存在)。将for循环更改为while循环,如下所示

import java.util.Scanner;
public class Solution{
public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    StringBuilder sb = new StringBuilder(scan.nextLine());
    int c=0;

    while(c< sb.length()-1){
        if(sb.charAt(c) == sb.charAt(c+1)){
            sb.delete(c,c+2);
            c=0;
        }
        else{
            c+=1;
        }
    }
    if(sb.length() == 0)
        System.out.println("Empty String");
    else
        System.out.println(sb.toString());
}
import java.util.Scanner;
公共类解决方案{
公共静态void main(字符串[]args){
扫描仪扫描=新扫描仪(System.in);
StringBuilder sb=新的StringBuilder(scan.nextLine());
int c=0;
而(c

}您必须使用while循环。您的代码的问题是它只在代码中迭代一次。在第一次迭代中,虽然您的输入“baab”变为“bb”,但它会检查第二个b,并尝试在i+1中找到一个“b”(它不存在)。将for循环更改为while循环,如下所示

import java.util.Scanner;
public class Solution{
public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    StringBuilder sb = new StringBuilder(scan.nextLine());
    int c=0;

    while(c< sb.length()-1){
        if(sb.charAt(c) == sb.charAt(c+1)){
            sb.delete(c,c+2);
            c=0;
        }
        else{
            c+=1;
        }
    }
    if(sb.length() == 0)
        System.out.println("Empty String");
    else
        System.out.println(sb.toString());
}
import java.util.Scanner;
公共类解决方案{
公共静态void main(字符串[]args){
扫描仪扫描=新扫描仪(System.in);
StringBuilder sb=新的StringBuilder(scan.nextLine());
int c=0;
而(c
}你可以做
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    StringBuilder sb =new StringBuilder(in.nextLine());

   for (int i=0; i<sb.length()-1; i++){
        if(sb.charAt(i)==sb.charAt(i+1)){
            sb.delete(i, i+2);
            i=-1;

     }
    }
    if(sb.length()==0){
        System.out.println("Empty String");
    }else{
        System.out.println(sb);
    }
   }