将重复项转换为字符串中的不同字母

Turn duplicates into distinct letters in a String

我们将得到一个字符串s。假设例如“creepfe”。我们想要做的是删除重复项,而是在该位置添加一个新字母,并且新字母必须是按字母顺序排列的重复字母旁边可用的不同字母。所以它是这样的:

creepfe 到 crefpfe -- 第一个 e 是不同的,第二个 e 变为不同的 f。

crefpfe 到 crefpge -- 第二个 f 更改为 g,因为我们之前已经有了 f。

crefpge 到 crefpgf -- 因为 e 已经存在。

现在我们再次得到 f duplicate ,所以将其更改为 crefpgg ,它再次得到 g duplicate 所以最后我们到达“crefpgh”,它有所有不同的字母。

最近开始学习 java,感谢工作代码,但真正需要的是好的算法。

编辑:是的,大写字母也算作重复。并且字符串长度限制在 10-15,所以不用担心 运行 出不同的字母。

  • 找到字符串包含重复项的位置。对此有多种方法。您可以 Google 找到适合您方法的最有效方法。
  • 按字母顺序生成下一个字符。下面的代码展示了如何做到这一点
String value = "C";
int charValue = value.charAt(0);
String next = String.valueOf( (char) (charValue + 1));
System.out.println(next);
  • 重复该过程直到不再有重复项(有一个 while 循环,当没有更多重复项时中断)

这是一个解决方案。如果有重复,我使用递归将字母左移。我还回去重新编写了我的代码以包含 MBo 提到的集合。它不是最有效的,但它是您等待更有经验的 SO

成员的建议时的一个开始
public class tester {
    public static void main(String[] args){
        //Application.launch(testclass.class, args);
        String str = "creepFeZZ";

        System.out.println(processStr(str));

    }

    public static String processStr(String str){
        StringBuilder sb = new StringBuilder();
        HashSet<String> seen = new HashSet<>();

        insertStr(sb, seen, String.valueOf(str.charAt(0)));

        for (int i=1; i<str.length(); i++){
            char currentchar = str.charAt(i);
            char processedchar = goNext(seen, currentchar);
            insertStr(sb, seen, String.valueOf(processedchar));
        }

        //System.out.println(seen.toString());

        return sb.toString();
    }

    private static void insertStr(StringBuilder sb, HashSet seen, String str){
        seen.add(str.toLowerCase());
        sb.append(str);
    }

    private static char goNext(HashSet seen, char c){
        if (c>= 65 && c<=90){
            //if uppercase letter, check if contains lowercase version
            if (seen.contains(String.valueOf((char)(c+32)))){
                c = goNext(seen, (char)(c+1));
            }
            //any left shifting will overflow back to A
            return (char) ((c -(int) 'A') % 26 +(int) 'A');
        }else{
            //if lowercase letter, just check if contains
            if (seen.contains(String.valueOf((char)(c)))){
                c = goNext(seen, (char)(c+1));
            }
            //any left shifting will overflow back to a
            return (char)((c-(int) 'a') % 26 +(int) 'a');
        }
    }
}

这给出了输出: crefpGhZA