#1039字符串消除(java)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HihoCode#1039字符串消除
一、问题描述
输入:
输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。
之后T行每行一个由
'A''B''C'组成的字符串s,长度不超过100。
输出:
对于每一行输入的字符串,输出小Hi最高能得到的分数。
提示:
第一组数据:在"ABCBCCCAA"的第2个字符后插入'C'得到"ABCCBCCCAA",消除后得到"A",总共消除9个字符(包括插入的'C')。
第二组数据:"AAA"插入'A'得到"AAAA",消除后得到"",总共消除4个字符。
第三组数据:无论是插入字符后得到"AABC","ABBC"还是"ABCC"都最多消除2个字符。
二、解题思路
基于每行字符串长度不超过100,我们可以用“尝试法”,即对字符串每个位置依次插入“A”,“B”,“C”,然后求出每个位置的最大消除长度,比较获取最大消除长度。
时间复杂度=100*3*每次消除复杂度
三、问题解答
我们不妨先将问题步骤化:
1)消去字符串中重复字符(只消去一次)。
2)循环消去字符串直至字符串没有重复字符。
这两步解决了对于给定字符消去重复的效果。
这两步拆分开可以降低编写难度。
publicstatic String removal(String str) {
if (str.length() <= 1) {
return str;
}
StringBuilder s = new StringBuilder();
char pre = str.charAt(0);
boolean flag = false;//标示字符串有没有相邻重复字符。
for (int i = 1; i<str.length(); i++) {
if (pre == str.charAt(i)) {
flag = true;
} else {
if (flag) {
//字符相同舍弃
pre = str.charAt(i);
flag = false;
} else {
//字符不同加入
s.append(pre);
pre = str.charAt(i);
}
//如果与前面字符不同的话,加入最后的字符
if (i == str.length() - 1) {
s.append(str.charAt(i));
}
}
}
return s.toString();
}
采用递归多次消重。
publicstatic String remove(String str){
String tempStr = removal(str);
//直至字符长度不变
if (str.length() == tempStr.length()) {
return tempStr;
}
return remove(tempStr);
}
3)插入字符串指定位置,获取最大消除长度(依次A,B,C获取最大长度)
publicstaticint removeMax(String str, int index) { char[] ch = { 'A', 'B', 'C' };
int max =0 ;
for (int i = 0; i<ch.length; i++) {
String newStr = str.substring(0, index) + ch[i] + str.substring(index);
int n =newStr.length()- remove(newStr).length();
if (max<n)
max = n;
}
return max;
}
4)获取字符串结果--遍历字符串每个位置寻找最大长度publicstaticint getResult(String str) {
int max = 0;
for (int i = 0; i<str.length(); i++) {
int n = removeMax(str, i);
if (max<n)
max = n;
}
return max;
}
5)问题解答
publicstaticvoid main(String[] args) {
Scanner scan = new Scanner(System.in);
int t = scan.nextInt();
String[] s = new String[t];
for (int i = 0; i<t; i++) {
s[i] = scan.next();
}
for (int i = 0; i<t; i++) {
System.out.println(getResult(s[i]));
}
scan.close();
}。