1. 程式人生 > >LeetCode演算法題-First Unique Character in a String(Java實現)

LeetCode演算法題-First Unique Character in a String(Java實現)

這是悅樂書的第213次更新,第226篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第81題(順位題號是387)。給定一個字串,找到它中的第一個非重複字元並返回它的索引。 如果它不存在,則返回-1。例如:

輸入:“leetcode”
輸出:0

輸入:“loveleetcode”,
輸出:2

注意:您可以假設該字串僅包含小寫字母。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

直接使用字串自帶的方法indexOf和lastIndexOf,只要這兩個方法找到當前字元所在的索引相等,即表示當前字元就是第一個非重複字元。

此解法的時間複雜度最好的情況是O(n),最壞的情況是O(n^2),空間複雜度是O(1)。

public int firstUniqChar(String s) {
    for(int i=0; i<s.length(); i++){
        if (s.indexOf(s.charAt(i)) == s.lastIndexOf(s.charAt(i))) {
            return i;
        }
    }
    return -1;
}


03 第二種解法

因為題目給定範圍是侷限於小寫字母,可以使用一個長度為26的陣列,儲存每個字元出現的次數,然後再去陣列中找到只出現一次的字元,返回索引即可。

此解法的時間複雜度是O(n),空間複雜度是O(1),因為陣列長度是定長的。

public int firstUniqChar2(String s) {
    int[] arr = new int[26];
    for (int i=0; i<s.length(); i++) {
        arr[s.charAt(i)-'a']++;
    }
    for (int j=0; j<s.length(); j++) {
        if (arr[s.charAt(j)-'a'] == 1) {
            return j;
        }
    }
    return -1;
}


04 第三種解法

此解法和第二種解法思路一致,區別在於陣列容量變成了256,可以直接使用當前字元所表示的整數,而不必像第一種解法那樣要減去字元小寫a的值。

此解法的時間複雜度是O(n),空間複雜度是O(1),因為陣列長度是定長的。

public int firstUniqChar3(String s) {
    int[] arr = new int[256];
    for (int i=0; i<s.length(); i++) {
        arr[s.charAt(i)]++;
    }
    for (int j=0; j<s.length(); j++) {
        if (arr[s.charAt(j)] == 1) {
            return j;
        }
    }
    return -1;
}


05 第四種解法

使用HashMap,key為當前字元,value為其出現次數,先使用迴圈,將所有字元put進去。再利用迴圈,判斷當前字元作為key在map中的value是否等於1,如果相等,返回當前索引。

此解法的時間複雜度是O(n),空間複雜度是O(1),因為map中至多會儲存26個鍵值對。

public int firstUniqChar4(String s) {
    Map<Character, Integer> map = new HashMap<Character, Integer>();
    for(int j=0; j<s.length(); j++){
        map.put(s.charAt(j), map.getOrDefault(s.charAt(j), 0)+1);
    }
    for (int i=0; i<s.length(); i++) {
        if (map.get(s.charAt(i)) == 1) {
            return i;
        }
    }
    return -1;
}


06 小結

演算法專題目前已連續日更超過兩個月,演算法題文章81+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!