劍指 Offer 50 第乙個只出現一次的字元

2021-10-24 09:11:56 字數 1772 閱讀 2947

題目描述:

在字串 s 中找出第乙個只出現一次的字元。如果沒有,返回乙個單空格。 s 只包含小寫字母。

示例:

s = 「abaccdeff」

返回 「b」

s = 「」

返回 " "

解題思路:

1、線性掃瞄:

由於字串中的字元種類最多只有26個,因此可以使用容量為兩個陣列countindex來分別儲存每種字元的出現次數和第一次出現的位置。首先掃瞄一遍陣列,統計字元的資訊,然後再次掃瞄count陣列,遍歷次數為1的字元並不斷更新這些字元的最小位置。

2、雜湊表統計:

這種解法和解法1很類似,所不同的是這裡只需要使用乙個雜湊表hashmap來統計資訊,key記錄的是字元,value記錄的該字元是否只出現了一次,統計的方式是map.put(ch, !map.containskey(ch)),也就是只要當雜湊表沒有當字元時(即該字元時第一次出現),value的值才是true,其他情況下value的值是false。由於雜湊表並沒有儲存字元出現的順序,因此需要再次遍歷陣列。

3、有序雜湊表統計:

這種解法和解法2很類似,所不同的是這裡使用了有序雜湊表linkedhashmap,有序雜湊表是根據插入的鍵值對的順序來進行遍歷的(修改鍵值對不影響原先插入的順序),這樣就不用再次遍歷陣列了,只需要遍歷雜湊表即可,這種解法在字串中存在很多重複字元時再次掃瞄次數比原先雜湊表統計的掃瞄次數少很多

時間複雜度和空間複雜度:以上解法的時間複雜度都為o(n),空間複雜度為o(1)(無論是開闢陣列還是雜湊表統計,所需要的空間都是常數級空間)。

實現**:

//解法1:線性掃瞄

public

char

firstuniqchar

(string s)

else

count[ch -

'a']++;

}int minindex = integer.max_value;

for(

int i =

0; i < count.length; i++)if

(count[i]==1

&& index[i]

< minindex)

minindex = index[i];if

(minindex == integer.max_value)

//沒有只出現一次的字元

return

' ';

return s.

charat

(minindex);}

//解法2:雜湊表統計

public

char

firstuniqchar1

(string s)

//解法3:有序雜湊表統計

public

char

firstuniqchar2

(string s)

劍指Offer50 第乙個只出現一次字元

class solution for auto c s for auto c s return 自己寫的 劣勢在於使用集合而不是對映,因此無法存對應字元出現的次數,因此當insert乙個重複字元時,它可能是所求的目標字元,也可能是後面的,例如google,insert第二個o時,當前所求的目標字元 ...

劍指Offer 50 第乙個只出現一次的字元

在字串中找到第乙個只出現一次的字元。例 輸入 abaccdeff 則輸出 b 遍歷字串,每個字母第一次出現時將字母作為key,index作為val存入字典,當在字典中有key時,則將val改寫為 1,表示出現2次以上。遍歷字串結束後,遍歷字典,輸出位置最小的字元。時間複雜度 o n 空間複雜度 o ...

劍指offer 50 第乙個只出現一次的字元

劍指offer 50.第乙個只出現一次的字元 edited by ryunin date 2019 05 06 include include needed using namespace std using namespace gnu cxx needed class solution else ...