【每日一题0929】一站到底第二季

:woman_mage:给定一个纯小写字符串,如果其中存在两个字母是相同的(不必相邻),那么将它们两个一起替换成字母表中下一个字母。例如“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");
    }