【问题标题】:To Reduce a String减少字符串
【发布时间】:2017-02-14 16:39:32
【问题描述】:

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

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

Shil 想尽可能地减少 S。为此,他将尽可能多地重复上述操作。通过查找和打印 的不可约形式来帮助 Shil!

如果最终字符串为空,则打印 Empty String;否则,打印最终的不可约字符串。

样本输入 0

aaabccddd

样本输出 0

abd

示例输入 1

样本输出 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 时失败。

【问题讨论】:

  • 我运行了你的程序,它似乎将你的输入字符串“baab”的输出打印为“bb”
  • 这是一个挑战,但这里有一个来自github hackerrank.com/challenges/reduced-stringgithub.com/shengmin/coding-problem/tree/master/hackerrank/…的解决方案
  • “baab”不应该产生“b”吗?
  • 不,如果是“baab”,它应该打印空字符串。
  • 我正在从那里解决挑战。但我不想看到解决方案。我需要知道我是否可以通过我正在尝试的这种方法解决,如果可以,我在做什么错了吗?

标签: java string stringbuilder


【解决方案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());
}

}

【讨论】:

  • 我已经编辑了代码并在循环中添加了 i =0 以便它再次检查第一个 b。你能检查一下吗?如果这可能是一个有效的过程?
  • 当然我会检查的。请给我一点时间。
  • 不客气。根据这篇文章,在 for 循环中更改索引太令人困惑了。因此,最好使用 while 循环。 link 。 .
  • 好的,一件事你为什么在这里使用“更改”变量?我只是不明白它的用途。
  • 可以删除。我在答案中改变了这一点。
【解决方案2】:

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

【讨论】:

  • 当字符串只有一个可约子串时,你的代码正好。
  • 嘿,代码工作正常。但让我了解一下它是如何工作的。非常感谢你..:)
【解决方案3】:

你可以在标签的帮助下试试这个,

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

【讨论】:

    【解决方案4】:

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 2015-02-10
      • 2014-11-15
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多