2012-02-12 163 views
0

我正在做一個編碼程序,我應該刪除出現兩次的字符串中的每個字符。我試圖遍歷字符串,但它沒有奏效。有誰知道如何做到這一點?謝謝。查找字符串中的字符

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

你可以發佈你的嘗試,我們會告訴你如何解決它。 – dasblinkenlight 2012-02-12 02:03:25

+0

那裏我編輯了它 – 2012-02-12 02:06:49

+0

首先,你爲什麼要添加字母表?此外,你正在從字符串的兩端同時迭代。隨着'我'增加,'j'減少;所以如果一個實例距離字符串的前面很遠,而另一個實例來自後面,則只會發現重複。第三,'j'應該從'newword.length() - 1'開始,而不是'newword.length()';否則對'newword.charAt(j)'的第一次調用將會試圖超出'String'的末尾。嘗試解決這三個問題;如果你仍然陷入困境,請再次發帖。 – 2012-02-12 02:24:59

回答

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

+0

我會使用'BitSet',這可能會更簡單一些。咩。 – 2012-02-12 03:36:42

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語句在中間,以處理我== j案件。

再次編輯:這是一個幾乎相同的帖子:function to remove duplicate characters in a string

+0

這似乎並不奏效:當'i == j'時,你的算法會認爲它是同一個字母。 – dasblinkenlight 2012-02-12 02:34:28

+0

謝謝。沒有意識到這一點。我爲這種情況添加了一個if檢查。 – dkniffin 2012-02-12 02:44:01

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(); 
} 

這段代碼的效率是有爭議的:)這可能是更好的方法來計算一個循環的字符出現次數。