字串處理 找到第乙個不重複的

2021-08-03 08:03:31 字數 1694 閱讀 1932

實際上字串的處理一直是各種測試的難點。為什麼叫難點呢?因為很多字串處理,會因為處理方法的不同而導致記憶體和時間的花費差異巨大。所以說這也是別人經常說的乙個考點。

今天博主也隨意寫了乙個字串的處理問題。

問題描述:

編寫乙個高效的函式,找到字串中首個非重複的字元。例如:「tatol」首個非重複的字元時a,「teeter」中首個非重複的字元時r。

但是這樣做的時間複雜度是多少呢?n個字元,每個字元比較(n-1)次,那麼時間複雜度就是n*n。這種複雜度還是挺坑爹的,因為在字串處理中一般能輕易想到的方法都是各種次方的時間複雜度,真是蛋疼啊。

實際上,就博主各種的閱讀,發現,其實各種什麼單個字元的查詢之類都可以使用接個陣列進行解決。雖然說空間複雜度增加了,但是時間複雜度減少了很多。

// blog_find_first_unique_char.cpp : 定義控制台應用程式的入口點。 //

#include "stdafx.h"

#include

#include

#include

#include  

// for uintmax_t

#include

#include

using namespace boost;

class new_progress_timer : public timer, private noncopyable//公有繼承timer,這是定時器類,noncopyable需要私有繼承,說明這個類的物件不可賦值不可拷貝

//這裡就是各種初始化了

~new_progress_timer()

catch (...) {} // eat any exceptions

} // ~progress_timer

private:

std::ostream & m_os; };

//這是第一種方法,用的就是n*n演算法複雜度的,兩個迴圈就可以解決的比較

bool method_1(char *source, size_t length)//這裡我要說一下,對於c風格的字串和陣列,大家最好是直接把長度傳進來。雖然說,char*可以通過strlen得到長度,但是我個人的風格就是傳長度。因為int,double之類的陣列,沒有了傳遞的length,就是真的是不知道長度了。

if(tempj==length)//如果比較了全部字串都沒有找到重複的,就可以認為是首個唯一的

} return false; }

//第二種方法主要的思路是:

//首先宣告兩個額外的陣列,乙個儲存每個字元出現的次數,乙個儲存每個字元最後出現的額位置(假設只有26個字元)。遍歷一遍,記下每個字元的次數,找出出現一次的陣列下表。然後在比較所有出現一次陣列的位置大小,最小位置的就是首次出現唯一字元。

bool method_2(char *source, size_t length)

;//儲存每個字元出現的次數

int char_pos[26]=;//儲存每個字元最後出現的位置

for(size_t tempi=0;tempi

int pos=0x7fffffff;//將初始化的位置宣告為int  

maxfor(int tempi=0;tempi<26;++tempi)

} if(pos!=0xefffffff)

return false; }

int main()

執行結果:

字串 第乙個不重複的字元

有關這個題目可以有很多的考察方式,但是本質的乙個方法就是利用hash表,來降低時間複雜度。先看第乙個題目,給定乙個字串,找到這個字串的第乙個不重複的字元 在乙個字串 1 字串長度 10000,全部由字母組成 中找到第乙個只出現一次的字元的位置。若為空串,返回 1。位置索引從0開始。所以 實現 int...

找出字串中第乙個不重複的字元

leetcode原題位址 將字串轉換成字元陣列 使用兩層迴圈遍歷,最終根據第二層迴圈退出時的下標值來判斷是否是不重複的字元 我的 public intfirstuniqchar string s if temp i temp j if j length if i length return resu...

字串的第乙個不重複數字的索引

問題 給定乙個字串,找到它的第乙個不重複的字元,並返回它的索引。如果不存在,則返回 1。解題思路 先統計每個字串裡數字的count,然後利用enumerate函式的特性,找到它的索引 class solution def firstuniqchar self,s str int type s str...