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+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!