資料結構之 字串

2021-08-09 08:51:22 字數 2397 閱讀 1686

一、簡介

字串或者說串(string)是由數字、字母。下劃線組成的一串字元。一般可以記為s="a0a1a2a3...an" (n>=0並且n是有限非負整數)。

從資料結構上來看,用c++來說,字串是一種特殊的線性表,也就是裡面的每個元素都是字元的一種線性表。可以是用陣列實現,或者鍊錶實現。具體的優缺點可以參照陣列和鍊錶的優缺點。

二、c++中的字串string

而在c++中的string(標頭檔案為string),其中儲存的變數的char *,也就是乙個不定長的字元陣列,因為它過載了運算子,可以像陣列一樣去用下標訪問元素;也可以說是乙個鍊錶,因為本質就是指標操作。但是其實內部實現是根據大小去調整string的大小的。我先貼出關於常用的一些string函式的宣告:(沒有考慮空間申請失敗的情況)

#include using namespace std;

class string ;

其實實現也不是很難的,我覺得比較核心的是關於長度的變換這一部分,所以我只貼出建構函式和+號過載的實現:

string::string() 

string::string(const size_t length, const char c)

string::string(const string& str)

string operator+(const string& s1, const string& s2)

其中上面涉及的str開頭的函式,是c標準庫裡面的或者裡面的函式,是對char陣列進行的一系列操作,所以string實際上是為了把char陣列變成一種更加方便使用的一種物件,通過過載操作符,能做到像int,float這種資料型別的一些操作,同時又保留著char陣列下標訪問的特性,能直接用s[i]的形式去訪問某一元素,而且也是在常數時間內就完成的。所以用完string,會有一種不再想用char*的感覺。

不過話說回來,如果對裡面的一些函式不了解的話,我建議先回去把這部分的學一學,如果需要的話,我可以把的自己實現的乙個標頭檔案給你參考一下= =(你不嫌棄的話)。

三、字串的模式匹配

模式匹配(pattern matching)

-乙個目標物件t(字串)

-模式p(字串)

在目標t中尋找乙個給定的模式p的過程

例如:文字編輯時的特定詞、句的查詢;dna資訊的提取等等

簡單來講,就是給定你一大段字串,然後檢視裡面是否存在某個子串,例如"abc"。

解決匹配問題的演算法:樸素演算法(brute force)和kmp演算法(knuth-morrit-pratt)等等

*樸素演算法

例如給定乙個字串 t="abcdabcdabcdef"

然後尋找在t中是否存在乙個模式p=「abcdef"

所以樸素演算法是指在t中一位一位得開始尋求匹配,例如第一步是:

abcdabcdabcdef

abcdef

這時候發現不匹配,然後就繼續從t的第二位開始尋求匹配:

abcdabcdabcdef

abcdef

發現不匹配,就這樣一直下去,一直到:

abcdabcdabcdef

abcdef

發現這時候匹配了模式p,所以存在,然後返回t中匹配的開頭的下標。

這個就是樸素演算法,像個大傻一樣乙個乙個的挪,挪到合適的位置。分析一下,上面的例子肯定得巢狀兩層的迴圈才能做到這樣的遍歷,所以時間複雜度肯定是在o(t * p)

假如這個字串t很長很長,例如1w+個字元,而且模式p也有還幾千個字元,那不就很麻煩?所以這就是樸素的侷限性。下面會講到kmp演算法,這個就是乙個比較簡單的匹配的演算法。

*kmp演算法

-kmp是一種不回溯的匹配演算法,也就是當t子串t不匹配模式p的是否,但是卻存在模式p的子串p和t的子串t'匹配的話,假如能消除這個冗餘的操作的話,就能大大加快速度。

-kmp演算法就是確定這樣的乙個情況,確定應該右移多少位。

-而且kmp右移k位的k值僅僅依賴於模式p的本身,和t無關。

如下直接推薦乙個寫kmp演算法的部落格,寫得很好!

傳送門:kmp演算法

以下是kmp演算法**,主要分為構造next陣列,已經主體的迴圈框架:(沒測試過的)

#include #include using namespace std;

int kmpstrmatching(string t, string p, int *n, int start)

while (j < plen && i < tlen) else

} if (j >= plen) else

}int findnext(string p)

j++;

k++;

next[j] = k;

} return next;

}

資料結構之字串

夢醒瀟湘love 1 串的相關概念 1 串 string 是由零個或多個字元組成的有限序列,又名叫字串。2 串中含有的字元資料稱為串的長度,零個字元的串稱為空串 null string 它的長度為零。3 子串與主串,串中任意個數的連續字元組成的子串行稱為該串的子串,相應地,包含子串的串稱為主串。4 ...

資料結構演算法之字串

字串是由若干個字元組成,在c c 中常常使用 0 字元作為結尾,這樣很方便的為我們查詢到字串的最後乙個字元。為了節省空間,c c 常常將字串單獨放到乙個記憶體空間中,當幾個指標賦予相同的變數時,實際上他們會指向相同的位址空間 實現乙個函式將字串中的空格替換成 20 實現方式 方式一 如果是建立新的字...

資料結構之動態字串

型別別名,用於指向 sdshdr 的 buf 屬性 typedef char sds 儲存字串物件的結構 struct sdshdr 動態字串是redis的基礎資料結構之一,這裡並沒有簡單地只用c中常用的char 型別來儲存字串,而是建立了乙個sdshdr的結構體,該結構體包含三個組成元素,欄位le...