classSolution{ public String makeGood(String s){ StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < s.length(); i++) { if(i==s.length()-1){ stringBuilder.append(s.charAt(i)); } elseif (Character.isUpperCase(s.charAt(i)) && !Character.isUpperCase(s.charAt(i + 1)) && Character.toLowerCase(s.charAt(i)) == s.charAt(i + 1)) { i += 1; } elseif (!Character.isUpperCase(s.charAt(i)) && Character.isUpperCase(s.charAt(i + 1)) && Character.toUpperCase(s.charAt(i)) == s.charAt(i + 1)) { i += 1; } else { stringBuilder.append(s.charAt(i)); } } //递归处理 return s.length() == stringBuilder.length() ? s : makeGood(stringBuilder.toString()); } }
递归的内存消耗和时间复杂度无疑非常令人痛苦,那就接着考虑一下这题有没有更优雅一点的实现方案。在依次遍历输入字符串 s 的时候,如果不满足要求场景,选择拼接字符串。 如图所示:
这是新串的 b 与老串的 B 满足场景,弹出新串最后一个元素(栈顶元素),老串顺移下标。此时新串的栈顶 a 与老串的 A 仍满足场景,弹出 a 元素,遍历老串的下标再次+1。当新串栈顶与老串当前字符不满足场景时。新串入栈老串的当前字符。这种做法时间复杂度只有 O(n) 。而且省去了递归造成的栈内存损耗。
最终代码
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution{ public String makeGood(String s){ StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < s.length(); i++) { if (stringBuilder.length() > 0 && Character.toLowerCase(stringBuilder.charAt(stringBuilder.length()-1)) == Character.toLowerCase(s.charAt(i)) && stringBuilder.charAt(stringBuilder.length()-1) != s.charAt(i)) { stringBuilder.deleteCharAt(stringBuilder.length()-1); } else { stringBuilder.append(s.charAt(i)); } } return stringBuilder.toString(); } }
Copyright by @maybelence.