算法學習之第一個不重複的字符

題目一:字符串中第一個只出現一次的字符。

在一個字符串(0<=字符串長度<=10000,全部由字母組成)中找到第一個只出現一次的字符,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫)。

思路:有些類似於hash表,使用字母對應的ascII作爲下標計數,然後遍歷得到的首個計數爲1的字母就是目標值了

// 大小寫字母一共52個,對應的ascII爲65~90  97~122 中間隔了6位所以數組長度58位就夠用了
public int firstNotRepeatingChar(String str) {
        if (TextUtils.isEmpty(str)) return -1;
        int[] counts = new int[58];
        int length = str.length();
        for (int i = 0; i < length; i++) {
            counts[str.charAt(i) - 65]++; // 根據字母的ascII定爲index然後計數
        }
        for (int i = 0; i < length; i++) {
            if (counts[str.charAt(i) - 65] == 1) {
                return i;
            }
        }
        return -1;
    }
  • 時間複雜度:O(n)。
  • 空間複雜度:O(1)。

題目二:字符流中第一個只出現一次的字符。

請實現一個函數,用來找出字符流中第一個只出現一次的字符。例如,當從字符流中只讀出前兩個字符"go"時,第一個只出現一次的字符是'g'。當從該字符流中讀出前六個字符“google"時,第一個只出現一次的字符是'l'。

思路,同樣使用ascII爲索引進行計數,同時使用StringBuilder進行拼接記錄,獲取目標值時獲取到builder的首個index處值爲1的字符即爲目標值

  /**
     * 活的字符流中第一個不重複字母
     */
    int[] count = new int[256];
    StringBuilder builder = new StringBuilder();

    public void Insert(char ch) {
        count[ch]++;
        builder.append(ch);
    }

    public char getFirstNotRepeatingChar() {
        for (int i = 0; i < builder.length(); i++) {
            if (count[builder.charAt(i)] == 1) return builder.charAt(i); // 首個等於1的就是目標值了
        }
        return '#';
    }
  • 插入時間複雜度:O(1)。
  • 插入空間複雜度:O(1)。
  • 尋找時間複雜度:O(1)。
  • 尋找空間複雜度:O(1)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章