关于字符串两端删减的,程序一直输出不了,希望帮我解答

//有一个字符串,很长,由26个小写字母组成。有一天它在照镜子的时候,觉得自己太肥了,于是它想减肥。
//减肥的时候,可以不断地去掉第一个或者最后一个字符。它希望自己减肥之后,对于小写字母a、b、c,自己身上都至少保留有一个。
//它想知道自己减肥后的样子,你能帮帮它吗?(打印减肥后的字符串)
import java.util.*;
public class Jf{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        StringBuffer sb=new StringBuffer();
        System.out.println("请输入字符串");
        String str=sc.nextLine();
        String son="abc";
        sb.append(str);
        int a,b,c;
        a=b=c=0;
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)==son.charAt(0)){
                a++;
            }else if(str.charAt(i)==son.charAt(1)){
                b++;
            }else if(str.charAt(i)==son.charAt(2)){
                c++;
            }
        }
        int i=0;
        int j=str.length()-1;
        while(a>=1&&b>=1&&c>=1){
            sb.delete(i,j);
        }
        System.out.println(sb.toString());

    }
    
}
//请输入字符串
//aabbcc
//没有输出结果

你这个while循环没有退出条件

  1. sb.delete(i,j); 这句根本不懂什么意思吧,这句是从i删到j-1的意思。
  2. 假设有个字符串ddabc,索引分别为01234,删掉第一个d之后,剩余索引不是1234,而是0123,所以删前面的时候不能移动的,一直删0号位就可以了
  3. 你这个while条件也不对,比如说我字符串是abc,现在都是1个,满足while,然后就删了,但是剩一个abc的情况就不能删了

按你的思路的代码:

public class Main {
    public static void main(String[] args) {
        Main main = new Main();

        Scanner sc=new Scanner(System.in);
        StringBuffer sb=new StringBuffer();
        System.out.println("请输入字符串");
        String str=sc.nextLine();
        String son="abc";
        sb.append(str);
        int a,b,c;
        a=b=c=0;
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)==son.charAt(0)){
                a++;
            }else if(str.charAt(i)==son.charAt(1)){
                b++;
            }else if(str.charAt(i)==son.charAt(2)){
                c++;
            }
        }
        
        while(true){
            char cc = str.charAt(0);
            if(cc=='a')
                --a;
            if(cc=='b')
                --b;
            if(cc=='c')
                --c;
            if(a==0||b==0||c==0)
                break;
            sb.deleteCharAt(0);
        }

        while(true){
            char cc = str.charAt(sb.length()-1);
            if(cc=='a')
                --a;
            if(cc=='b')
                --b;
            if(cc=='c')
                --c;
            if(a==0||b==0||c==0)
                break;
            sb.deleteCharAt(sb.length()-1);
        }

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


    }

}

但是,其实这题解题完全写错了,从思路就是错的。例子:abcatttttttbc
abc,atttttttbc都可以,但是abc更好,求abc各保留一个最瘦:

public class Main {
    public static void main(String[] args) {
        Main main = new Main();

        Scanner sc=new Scanner(System.in);
        System.out.println("请输入字符串");
        String str=sc.nextLine();
        System.out.println(main.getThin(str));


    }

    private String getThin(String str){
        int[] cnts = new int[3];
        int n = str.length();
        int left = 0;

        int start=0;
        int end=str.length();
        int type = 0;
        for(int right = 0; right < n; right++){
            int idx = str.charAt(right)-'a';
            if(idx>=0&&idx<3){
                if(cnts[idx]==0)
                    ++type;
                ++cnts[idx];
            }

            while(type == 3){
                if(right-left<end-start){
                    start = left;
                    end = right;
                }
                 idx = str.charAt(left++)-'a';
                if(idx>=0&&idx<3){
                    if(cnts[idx]==1)
                       --type;
                    --cnts[idx];
                }
            }
        }

        return str.substring(start,end+1);
    }

}

循环到while的时候,abc都是2,那一直执行delete,没有退出循环的条件,不就死循环了吗