减少字符串

时间:2016-10-06 04:18:52

标签: java string stringbuilder

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

  

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

abddd - > ABD

因此我们打印 abd

案例1: baab - > BB

bb - >空字符串。

到目前为止我所做的是尝试通过Java中的StringBuilder来解决它。但是有些测试用例通过而其他测试用没有通过,我无法找出错误是什么?

  

这是我到目前为止尝试过的代码。

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());
    for(int i = 0; i < sb.length()-1; i++)
        {
            if(sb.charAt(i) == sb.charAt(i+1))
                sb.delete(i,i+2);
                i  = 0;
        }
    if(sb.length() == 0)
        System.out.println("Empty String");
    else
        System.out.println(sb.toString());
}

}

aaabccddd

等输入

aa 传递。但当输入 baab 时,它失败了。任何人都可以帮助我吗?谢谢你的提示。

4 个答案:

答案 0 :(得分:1)

问题是你只需在字符串中循环一次。 例如: 字符串“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();
}
}

答案 1 :(得分:1)

你必须使用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());
}

}

答案 2 :(得分:0)

你可以在lable的帮助下尝试这个,

 public static void main(String[] args) {
     boolean canReduce = true;
     Scanner scan = new Scanner(System.in);
     StringBuilder sb = new StringBuilder(scan.nextLine());


     startPoint: while (sb.length() > 0 && canReduce) {
        for (int i = 0; i < sb.length() - 1; i++) {
            if (sb.charAt(i) == sb.charAt(i + 1)) {
                sb.delete(i, i + 2);
                canReduce=true;
                 continue startPoint;
            }else{
                canReduce=false;
            }

        }
    }

    if (sb.length() == 0) {

        System.out.println("Empty String");
    } else {

        System.out.println(sb.toString());
    }
}

答案 3 :(得分:0)

试试这个:

    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);
    }
   }