移除字符串中重複的字符

原文:算法

Design an algorithm and write code to remove the duplicate characters in a string without using any additional buffer. NOTE: One or two additional variables are fine. An extra copy of the array is not.數組

譯文:緩存

設計算法並寫出代碼移除字符串中重複的字符,不能使用額外的緩存空間。注意: 能夠使用額外的一個或兩個變量,但不容許額外再開一個數組拷貝。編碼

解答:spa

這道題目實際上是要你就地將字符串中重複字符移除。但須要肯定一點, 不能使用額外的一份數組拷貝是指根本就不容許開一個數組,仍是說能夠開一個固定大小, 與問題規模(即字符串長度)無關的數組。設計

  1. 如果根本就不容許開一個數組,那沒辦法了,遍歷數組,每訪問一個字符,而後將其後的重複字符刪除,時間複雜度爲O(n^2)。
    public String removeRepeatChar1(String s){ if(s == null || "".equals(s)){ return s; } StringBuffer Str = new StringBuffer(s); for(int i = 0; i < Str.length(); i++){ char temp = Str.charAt(i); //從後往前刪,不會出現數組越界問題
            for(int j = Str.length()-1; j > i ; j--){ if(temp == Str.charAt(j)){ Str.deleteCharAt(j); } } } return Str.toString(); }

  2.若是能夠開一個固定大小,與問題規模(即字符串長度)無關的數組,那麼能夠用一個數組來 表徵每一個字符的出現(假設是ASCII字符,則數組大小爲256),這樣的話只須要遍歷一遍字符 串便可,時間複雜度O(n)。下面的方法使用位向量存儲字符是否重複,也能夠申請一個boolean數組,長度爲256(針對ASCII)code

    public String removeRepeatChar2(String s){ //若該字符串是ASCII編碼,用位向量存儲
        if(s == null || "".equals(s)){ return s; } final int CONSTANT = 32; //數組皆爲0
        int[] ints = new int[8]; StringBuffer str = new StringBuffer(s); str = str.reverse(); //刪除是從後往前刪
        for(int i = str.length()-1;i>=0;i--){ //商,判斷在哪一個數組
            int ids = str.charAt(i) / CONSTANT; //餘數,判斷在數組的第幾位
            int shift = str.charAt(i) % CONSTANT; /** * 當前位是1,則返回true,說明前面該字符出現過 * 當前位是0,則置爲1。 */
            if((ints[ids] & 1<< shift) > 0) str.deleteCharAt(i); else ints[ids] =  ints[ids] | 1<< shift; } str = str.reverse(); return str.toString(); }
相關文章
相關標籤/搜索