//有一个字符串,很长,由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循环没有退出条件
按你的思路的代码:
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,没有退出循环的条件,不就死循环了吗