给定一个纯小写字符串,如果其中存在两个字母是相同的(不必相邻),那么将它们两个一起替换成字母表中下一个字母。例如“aaz"会变成"bz",以此类推,“aza"会变成"bz”。请编写一个函数,将给定的字符串中按照上述规则进行替换,返回处理后的字符串。
示例:
输入:“zzzab”,输出:“cz”。
解析:“zzzab"首先最前面的2个"z"合并替换成"a”,所以得到"azab";然后两个"a"合并替换成"b",得到"bzb";最后两个"b"合并得到"c",所以返回"cz"。
题目难度:中等
题目来源:codewars: Last Survivors Ep.2
def last_survivors(words: str) -> str:
pass
assert last_survivors("abaa") == "ac"
assert last_survivors("zzab") == "c"
assert last_survivors("zzzab") == "cz"
public String lastSurvivors(String s) {
if (s == "" || s.isEmpty() || getStatus(s)) {
return s;
}
StringBuilder stringBuilder = new StringBuilder(s);
for (int i = 0; i < stringBuilder.length(); i++) {
for (int j = i + 1; j < stringBuilder.length(); j++) {
if (stringBuilder.charAt(i) == stringBuilder.charAt(j)) {
if ('z'==stringBuilder.charAt(i)){
stringBuilder.setCharAt(i, 'a');
stringBuilder.delete(j, j + 1);
}else {
stringBuilder.setCharAt(i, (char) (stringBuilder.charAt(i) + 1));
stringBuilder.delete(j, j + 1);
}
break;
}
}
}
return lastSurvivors(stringBuilder.toString());
}
/**
* 判断字符串中是否有重复字符
* @param s
* @return true 没有重复 false 有重复
*/
public boolean getStatus(String s) {
HashSet objects = new HashSet<>();
char[] chars = s.toCharArray();
for (char c : chars) {
objects.add(c);
}
return objects.size() == s.length();
}
@Test
public void testLastSurvivors() {
assert lastSurvivors("zzzab").equals("cz");
assert lastSurvivors("zzab").equals("c");
assert lastSurvivors("zzzab").equals("cz");
}