将重复项转换为字符串中的不同字母
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
我们将得到一个字符串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