练习题目:
给定一个字符串,仅由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 FindMinLength {
public static void main(String[] args) throws IOException
{
while(true){
System.out.print("请输入要验证的字符串(仅包含a,b,c) : ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String bigStr = br.readLine();
if("end".endsWith(bigStr) && bigStr.length() == 0){
System.out.println("结束!");
break;
}else{
System.out.println(bigStr + "循环消除后最小长度为" + minLength(bigStr) +"\n");
}
}
}
//找出字符串中循环消除最小长度
public static int minLength(String bigStr){
//定义集合装载最小不可消除单位(当最小长度为1视为可消除,而最小不可消除字符串取三个不同的组合)
String smallStr[] = {"abc","acb","bca","bac","cab","cba"};
//判断原字符串是否全部字符相同
String newStr = bigStr.replaceAll(bigStr.substring(0, 1), "");
//如果全部相同则直接返回字符串长度
if(newStr.length() == 0){
return bigStr.length();
}else{
for(int i = 0;i < 6;i++){
//循环消除匹配的最小不可消除字符串
if(clean(bigStr,smallStr[i])){
bigStr = bigStr.replaceAll(smallStr[i], "");
}
}
int nowLen = bigStr.length();
//如果正好匹配掉所有字符串,则视为最小不可消除情况,最小长度为2
if(nowLen == 0){
return 2;
}
//判断消除过后的字符串是否全部字符相同
String overStr = bigStr.replaceAll(bigStr.substring(0, 1), "");
int overLen = overStr.length();
//当剩余字符串是2的倍数且全部相等的时候,则视为最小不可消除情况,最小长度为2
if(nowLen%2==0 && overLen == 0){
return 2;
}
}
return 1;
}
//判断bigStr中是否包含smallStr 有:返回true 无:返回false
public static boolean clean(String bigStr,String smallStr){
return bigStr.contains(smallStr);
}