一、字串的基本定義:
串:零個或多個字元組成的有限序列。
串長度:串中所包含的字元個數。
空串:長度為0的串,記為:" "。
子串:串中任意個連續的字元組成的子串行。
主串:包含子串的串。
子串的位置:子串的第乙個字元在主串中的序號。
概念定義:
1、給定主串s="s1s2…sn"和模式t="t1t2…tm",
2、在s中尋找t 的過程稱為模式匹配。
基本原理:
1、如果匹配成功,返回t 在s中的位置,如果匹配失敗,返回-1。
從主串s的第0個字元開始和模式t 的第0個字元進行比較,
2、若相等,則繼續比較兩者的後續字元;
3、否則,從主串s的第1個字元開始和模式t 的第0個字元進行比較,
4、重複上述過程,直到t 中的字元全部比較完畢,則說明本趟匹配成功;或s中字元全部比較完,則說明匹配失敗。
三、bf演算法:
1. 在串s和串t中設比較的起始下標i和j;
2. 迴圈直到s或t的所有字元均比較完;
2.1 如果s[i]==t[j],繼續比較s和t的下乙個字元;
2.2 否則,將i和j回溯(i=i-j+1,j=0),準備下一趟比較;
3. 如果t中所有字元均比較完,則匹配成功,返回匹配的起始比較下標(i-j);否則,匹配失敗,返回-1;
例:int bf(char s[ ], char t[ ])
else
}if (j>=t.length()) return (i-j);
else return -1;
}bf演算法若不成功則最壞情況:不成功的匹配都發生在串t的最後乙個字元。
bf演算法效能低的原因:在每趟匹配不成功時存在大量回溯,沒有利用已經部分匹配的結果。
四、kpm演算法基本原理:
1、在串s和串t中分別設比較的起始下標i和j;
2.、迴圈直到s中所剩字元長度小於t的長度或t中所有字元均比較完畢
2.1 如果s[i]==t[j],繼續比較s和t的下乙個字元;否則
2.2 將j向右滑動到next[j]位置,即j=next[j];
2.3 如果j=-1,則將i和j分別加1,準備下一趟比較;
3、如果t中所有字元均比較完畢,則返回匹配的起始下標;否則返回-1;
例:int kmp_findpat(char *s, char *t,int *next)
else
j=next[j];
}if(t[j]=='\0')
return i-j;
else
return -1;
}kpm演算法的優點: i可以不回溯,模式向右滑動到的新比較起點k ,並且k 僅與模式串t有關!
五、常用的對映方法有兩種:
按行優先:先行後列,先儲存行號較小的元素,行號相同者先儲存列號較小的元素。
按列優先:先列後行,先儲存列號較小的元素,列號相同者先儲存行號較小的元素。
六、矩陣的壓縮儲存:
特殊矩陣:矩陣中很多值相同的元素並且它們的分布有一定的規律。
稀疏矩陣:矩陣中有很多零元素。
壓縮儲存的基本思想是:
⑴ 為多個值相同的元素只分配乙個儲存空間;
⑵ 對零元素不分配儲存空間。
例:template
struct element
;稀疏矩陣的壓縮儲存——三元組順序表
儲存結構定義:
const int maxterm=100;
template
struct sparsematrix
;七、廣義表的基本概念:
長度:廣義表ls中的直接元素的個數;
深度:廣義表ls中括號的最大巢狀層數。
表頭:廣義表ls非空時,稱第乙個元素為ls的表頭;
表尾:廣義表ls中除表頭外其餘元素組成的廣義表。
字串和字串陣列
字串陣列 include int main int argc,const char ar printf name1 s n name1 name1 zhangsan 部分初始化中,沒有被初始化的元素預設是0,0 對應的ascii值是 0 char name2 9 printf name2 s n n...
字串和字串陣列和 0
c語言中字串為什麼要有 0呢?0在字串中的作用是什麼 0 在字串中標誌著結尾 用來判斷這個字串已經結束 如果不新增 0 系統就在記憶體中一直向後讀,直到讀到 0 為止 這個情況就造成錯誤 乙個語句結束了,就用分號 表示結束 首先要區分,字元,字元陣列,字串的區別。字串預設的最後會有 0 char k...
字串和字元陣列
void test1 函式test1中,指標str1所指向的字串有11個元素。一定要注意字串是以 0 為結尾的,而strcpy拷貝了整個字串包括 0 所以存在下標越界的問題。void test2 函式test2中,字元陣列str1包含10個元素。陣列str1並不是以 0 結束,所以不能作為字串使用。...