给定一个字符串,仅由a,b,c 3种小写字母组成。当出现连续两个不同的字母时,你可以用另外一个字母替换它,如 有ab或ba连续出现,你把它们替换为字母c; 有ac或ca连续出现时,你可以把它们替换为字母b; 有bc或cb 连续出现时,你可以把它们替换为字母a。 你可以不断反复按照这个规则进行替换,你的目标是使得最终结果所得到的字符串尽可能短,求最终结果的最短长度。 输入:字符串。长度不超过200,仅由abc三种小写字母组成。 输出: 按照上述规则不断消除替换,所得到的字符串最短的长度。 例如:输入cab,输出2。因为我们可以把它变为bb或者变为cc。 输入bcab,输出1。尽管我们可以把它变为aab -> ac -> b,也可以把它变为bbb,但因为前者长度更短,所以输出1。
根据别人的思路写出的代码,但是还是太慢了。
public class Main {
public static int minLength(String s){
if(sameChar(s)==s.length())
return s.length();
//替换第一个子串
String ss1=chageString(s,-1);
//替换第二个子串
String ss2=chageString(s,1);
//比较两个新串,取相同字符少的,继续该算法
if(sameChar(ss1) <= sameChar(ss2))
return minLength(ss1);
else
return minLength(ss2);
}
private static int sameChar(String s){
int a=0;
int b=0;
int c=0;
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='a'){
a++;
}
else if(s.charAt(i)=='b'){
b++;
}
else if(s.charAt(i)=='c'){
c++;
}
}
int max=0;
if(a>=b){
max=a;
}
else{
max=b;
}
if(max<=c){
max=c;
}
return max;
}
private static String chageString(String s,int a){
int i=0;
for(;i<s.length()-1;i++){
if(s.charAt(i)!=s.charAt(i+1))
break;
}
String sub=null;
if(a==-1){
if(i+2>=s.length()){
sub=s.substring(i);
}
else{
sub=s.substring(i,i+2);
}
if(sub.equals("ab")||sub.equals("ba")){
s=s.replaceFirst(sub,"c");
}
else if(sub.equals("ac")||sub.equals("ca")){
s=s.replaceFirst(sub,"b");
}
else if(sub.equals("bc")||sub.equals("cb")){
s=s.replaceFirst(sub,"a");
}
}
else if(a==1){
if(i+3>=s.length()){
sub=s.substring(i+1);
}
else{
sub=s.substring(i+1,i+3);
}
if(sub.equals("ab")||sub.equals("ba")){
s=s.replaceFirst(sub,"c");
}
else if(sub.equals("ac")||sub.equals("ca")){
s=s.replaceFirst(sub,"b");
}
else if(sub.equals("bc")||sub.equals("cb")){
s=s.replaceFirst(sub,"a");
}
}
return s;
}
public static void main(String[] args) {
}
}