2016-04-24 157 views
3

我開始閱讀着名的「破解編碼採訪」一書。在Java中刪除字符串中的重複字符

設計算法並編寫代碼以刪除字符串中的重複字符 而不使用任何附加緩衝區。注:一個或兩個額外的變量是好的。 數組的額外副本不是。

我發現這裏類似的話題:Remove the duplicate characters in a string

由筆者給出的解決方案是:

public static void removeDuplicates(char[] str) { 
    if (str == null) return; 
    int len = str.length; 
    if (len < 2) return; 

    int tail = 1; 

    for (int i = 1; i < len; ++i) { 
     int j; 

     for (j = 0; j < tail; ++j) { 
     if (str[i] == str[j]) break; 
     } 

     if (j == tail) { 
     str[tail] = str[i]; 
     ++tail; 
    } 
    } 
    str[tail] = 0; 
} 

這裏的問題是,筆者使用的陣列是這樣的一個說法功能。所以我的問題是:如何用STRING作爲參數編寫算法?因爲我覺得在這裏使用數組真的很容易,這就像你「避免了困難」(在我看來,我是一個新的Java開發者)。

你怎麼寫這樣的算法?

+0

有關問題的緣故,讓我們假設字符串是可變的,說你會從中移除字符:您可以使用String.charAt(位置),以獲得該字符在該位置一樣使用數組[位置]。 – Vucko

回答

3

Java字符串是不可變的,所以你不能在沒有將數組拷貝到緩衝區的情況下使用字符串。

+0

添加到此...'str [tail] = str [i]'是需要數組的語句。 –

0

爲了與String一起工作,您必須從代表修改後的str的方法返回String,而且沒有重複項。不知道它是否會違反規則,但這裏是我如何解決這個問題String的:

對於字符串中的每個字符,我會分割該字符串。我會從後面的子字符串中移除該字符的所有實例。然後我會連接前一個子字符串和修改後的子字符串,確保字符仍然保留在它的位置。是這樣的:

public static String removeDuplicates(String str) { 
    if(str == null || str.length() < 2) 
     return str; 
    String temp; 
    for(int x = 0; x + 1 < str.length(); x++) { 
     temp = str.charAt(x) + ""; 
     str = str.substring(0, x) + temp + str.substring(x + 1).replaceAll(temp, ""); 
    } 
    return str; 
}