我正在做一个编码程序,我应该删除出现两次的字符串中的每个字符。我试图遍历字符串,但它没有奏效。有谁知道如何做到这一点?感谢。
public static String encodeScrambledAlphabet(String str)
{
String newword = str;
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
newword += alphabet;
newword = newword.toUpperCase();
for (int i = 0, j = newword.length(); i < newword.length() && j >=0; i++,j--)
{
char one = newword.charAt(i);
char two = newword.charAt(j);
if (one == two)
{
newword = newword.replace(one, ' ');
}
}
newword = newword.replaceAll(" ", "");
return newword;
}
答案 0 :(得分:2)
假设您只想保留第一次出现的角色,您可以这样做:
boolean seen[65536];
StringBuilder res = new StringBuilder();
str = str.toUpperCase();
for (char c : str.toCharArray()) {
if (!seen[c]) res.append(c);
seen[c] = true;
}
return res.toString();
seen
数组包含标记,每个字符一个,表示我们已经看过这个字符。如果您的字符都是ASCII,则可以将seen
数组缩小为128
。
答案 1 :(得分:1)
假设删除两次出现的字符,则表示AAABB成为AAA,低于代码应该适合您。
static String removeDuplicate(String s) {
StringBuilder newString = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
String s1 = s.substring(i, i + 1);
// We need deep copy of original String.
String s2 = new String(s);
// Difference in size in two Strings gives you the number of
// occurences of that character.
if(s.length() - s2.replaceAll(s1, "").length() != 2)
newString.append(s1);
}
return newString.toString();
}
这段代码的效率是有争议的:)通过循环计算字符出现次数可能是更好的方法。
答案 2 :(得分:0)
因此,从您显示的代码来看,您似乎没有比较字符串中的每个字符。您正在比较第一个和最后一个,然后是第二个和倒数第二个。例如:
这是你的字符串: THISISTHESTRINGSTRINGABCDEFGHIJKLMNOPQRSTUVWXYZ
首次迭代,您将比较开头的T和结尾的Z. 第二次迭代,您将比较H和Y. 第三:我和X. 等
所以T a开头永远不会与其他角色进行比较。
我认为更好的方法是做一个双循环:
int length = newword.length(); // This way the number of iterations doesn't change
for(i = 0; i < length; i++){
for(j = 0; j < length; j++){
if(i!=j){
if(newword.charAt(i) == newword.charAt(j)){
newword.replace(newword.charAt(i), ' ');
}
}
}
}
我确信这不是最有效的算法,但它应该完成它。
编辑:在中间添加了一个if语句,以处理i == j case。
再次编辑:这是一个几乎相同的帖子:function to remove duplicate characters in a string