我正在解决一个问题,将形式简化为不可简化的形式。这就是问题。
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 时,它失败了。任何人都可以帮助我吗?谢谢你的提示。
答案 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);
}
}