万万没想到之聪明的编辑
万万没想到之聪明的编辑
http://www.nowcoder.com/questionTerminal/42852fd7045c442192fa89404ab42e92
1 万万没想到之聪明的编辑
1.1 题目描述
对输入字符串进行拼写错误检查,规则:
- 三个同样的字母连在一起,一定是拼写错误,去掉一个就好啦:比如helllo --> hello
- 两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二对的第一个字母就好啦:比如helloo --> hello
- 上面的规则优先“从左到右”匹配,即如果是AABBCC,应该优先考虑修复AABB,结果为AABCC
1.2 题目分析
根据题意,我们需要修复AAA型以及AABB型。遍历一遍字符串,创建一个StringBuilder变量sb进行模拟,判断什么情况下可以往sb中追加:
- 排除AAA型:当遍历字符串的索引小于2或者当前值不等于sb中的最后一个元素或者当前值不等于sb中倒数第二个元素时AAA型会被排除掉。
- 排除AABB型:当前索引位置小于3或者当前值不等于sb中的最后一个元素或者sb中倒数第二个元素不等于倒数第三个元素
辅助理解: AAA型——>长度小于2、abc(c此时不等于倒数第一个b)、abb(b此时不等于倒数第二个a) AABB型——>长度小于3、aabc(c此时不等于倒数第一个b)、abcc(c之前的倒数第二个b和倒数第三个a不相等)
1.3 代码
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); while (sc.hasNext()) { String str = sc.next(); String ans = correct(str); System.out.println(ans); } } // 矫正修复字符串 public String correct(String str) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < str.length(); i++) { char ch = s.charAt(i); // 排除AAA型 if (i < 2 || ch != sb.charAt(sb.length() - 1) || ch != sb.charAt(sb.length() - 2)) { // 排除AABB型 if (i < 3 || ch != sb.charAt(sb.length() - 1) || sb.charAt(sb.length() - 2) != sb.chatAt(sb.length() - 3)) { sb.append(ch); } } } return sb.toString(); } }