問題描述:
編寫乙個高效的函式,找到字串中首個非重複字元。
example:
total 首個非重複字元是 o
teeter 首個非重複字元是 r
分析:最直觀也是最容易想到的方式就是對每個字元在字串中遍歷
一遍,若出現相同的字元則退出遍歷,檢視下一字元,若遍歷完整
個字串均為出現相同字元,則表明該字元是首個非重複字元。
程式**如下:
bool firstnonrepeated1(std::string str, char &out)
} if (j >= str.length())
} return false;
}
從以上程式可以看出,其時間複雜度為o(n^2),效率不是很好,如何才能進一步提高它的效率呢?
我們知道陣列和雜湊表的查詢時間都是常數(雜湊表在最壞的情況下是o(n),但平均情況是
o(1))。要想能夠快速確定乙個字元是否重複,需要按字元來搜縮,這意味著需要用字元作
為下標(在陣列中)或鍵(在雜湊表中)。在陣列或雜湊表中會存放什麼呢?因為不重複的字元
只在字串中出現一次,所以若存放字元出現的次數,就能確定不重複的字元了。當完成
這項工作,就可在陣列或雜湊表中掃瞄所有的計數,尋找計數為1的字元,需要主要的是,
此時查詢的不重複字元不一定是原來字串中的第乙個不重複字元。解決方法是按照原字元
串順序進行查詢。
程式**如下:
bool firstnonrepeated(std::string str, char &out) ;
for (int i = 0; i < str.length(); ++i) else if (flag == 1)
} for (int i = 0; i 現在,程式的時間複雜度將為了o(n),但是與改進前相比,增加了空間複雜度,通常這是可取的。
參考:程式設計師面試攻略 第六章 陣列和字串
指標查詢重複字元
統計重複字元 4分 題目內容 輸入一串字元 字元數小於80 以回車表示輸入結束,程式設計計算並輸出這串字元中連續重複次數最多的字元和重複次數。如果重複次數最多的字元有兩個,則輸出最後出現的那乙個。已知函式原型 函式功能 統計字串中連續重複次數最多的字元及其重複的次數 函式引數 str指向待統計的字串...
非重複字串長度
問題 給定乙個字串,找出最長的不具有重複字元的子串的長度。例如,abcabcbb 不具有重複字元的最長子串是 abc 長度為3。對於 bbbbb 最長的不具有重複字元的子串是 b 長度為1。解 function lengthoflongestsubstring s let max 0let num ...
在字串中查詢是否有重複字元
字串型別的題目是面試筆試最青睞的型別。之一。最近陸陸續續重新開始看些基礎的東西,真是 三天不練手生 很多東西都忘得差不多了。記錄在這裡偶爾回顧的時候還能翻來看看。貼上來的程式經過測試的,但也可能有隱藏的bug。方法一 這是最節省記憶體的方法,但是效率一般般。複雜度為o n2 思路是,從字串的第乙個字...