資料結構 串

2021-09-28 16:15:42 字數 2731 閱讀 1357

串是僅有字元構成的有限序列,是一種線性表。一般記為s='a1a2...an',其中,s是串名,單引號括起來的字串行是是串值。

1)空串:長度為零的串。

2)空格串:由乙個或多個空格組成的串,空格也是乙個字元。

3)子串:由串中任意長度的連續字元構成的序列,含有子串的串稱為主串。子串在主串中的位置是指子串首次出現時,該子串的第乙個字元在主串中的位置。空串是任意串的子串。

1) 初始化

#define max_size 100

typedef struct

string;

int init(string *str)

else

}

2) 判斷空

bool isempty(string* str)

else

}

3)賦值

void strassign(string *str, char ch)

str->length = i;

if (i > max_size)

for (i = 0; i < str->length; i++)

str->ptr[str->length] = '\0';

}

4)連線 

void concat(string* s1, char ch)

//判斷總共有多少字元,如果大於最大則重新申請空間,再賦值

int totalsize = s1->length + i;

if (totalsize <= max_size)

s1->ptr[totalsize] = '\0';

} else

s1->ptr[totalsize] = '\0';

}}

(1)布魯特-福斯演算法(bf)從主串的第乙個字元起與模式串的第乙個字元比較,如果相等,則繼續逐一對字串的字元進行後續比較;如果不相等,則從主串第二個字元起與模式串的第乙個字元重新比較,直到模式串中每個字元依次和主串中乙個連續的字串行相等為止,此時匹配成功;否則,匹配失敗。

//從pos開始的位置,查詢模式串t在主串s串中是否存在

int index(char s,char t,int pos)

else

}if(j >= tlen)

return -1;

}

(2)kmp演算法改進之處在於,每當匹配過程**現相比較的字元不相等時,不需要回退主串的字元指標位置,而是利用已經得到的「部分匹配」結果將模式串向右「滑動」盡可能遠的距離,再繼續進行比較。在kmp演算法中,依據模式串的next函式值實現子串的滑動。

模式串aba

babb

下標012

3456

next陣列-10

0123

4 預設next[0] = -1

ab:除去最後乙個字元b,前面a,沒有相同的字首和字尾,則next[1] = 0;

aba:除去最後乙個字元a,前面ab,沒有相同的字首和字尾,則next[2] = 0;

abab:除去最後乙個字元b,前面aba,有相同的字元a ,next[3] = 0 + 1 =1;

ababa:除去最後乙個字元a,前面abab,有相同的字首和字尾ab,next[4] = 0+2 = 2;

ababab:除去最後乙個字元b,前面ababa,有相同的字首和字尾aba,next[5] = 0+3 = 3;

abababb:除去最後乙個字元b,前面ababab,有相同的字首和字尾abab,next[4] = 0+4 = 4;

以下為獲取next函式的演算法:

void get_next(char *p,int next)

else}}

以下為kmp演算法:

//利用模式串p的next函式,從第pos個字元開始,求p在主串s中是否存在

int kmp(char *s,char *p,int pos,int next)

else

}if(j >= plen)

else

}

以下為kmp演算法示意圖:

①第一次匹配從s[0]與p[0]開始,由於s[0]==p[0],s[1]==p[1],s[2]==p[2],比較s[3]和p[3],由於它們不相等,所以第一次匹配結束

②第二次匹配,令j = next[3] = 1,第二次從s[3]與p[1]開始比較,仍不相等,則第二次匹配結束

③第三次匹配,令j = next[1] = 0,第三次從s[3]與p[0]開始比較,仍不相等,則第三次匹配結束

④第四次匹配,令j = next[0] = -1,此時滿足條件「j == -1」,顯然不能令s[3]與p[-1]進行比較,說明主串中從i = 3開始的字串不可能與模式串相等,因此需要將 i 的值遞增後再繼續進行匹配,令i++,j++;

⑤第五次匹配,s[4]與p[0]比較,直到匹配完成

資料結構 串

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。結果請按字母順序輸出。我們求整個字串的排列,可以看成兩步 首先求所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元交換。第...

資料結構 串

串名 串值 串長 空串 空格串。字串的比較 字串模式匹配演算法 1.簡單字串模式匹配演算法 最簡單實現是用字串p的字元依次與字串t中的字元進行比較。實現思想是,首先將子串p從第0個字元起與主串t的第pos個字元起依次比較對應字元,如全部對應相等,則表明已找到匹配,成功終止。否則將子串p從第0個子串起...

資料結構 串

串 又稱字串 是一種特殊的線性表,它的每個結點僅由乙個字元組成。在早期的程式語言中,串僅在輸入或輸出中以直接量的形式出現,並不參與運算。隨著計算機的發展,串在文字編輯 詞法掃瞄 符號處理以及定理證明等許多領域得到越來越廣泛的應用。在高階語言中開始引入了串變數的概念,如同整型 實型變數一樣,串變數也可...