串 sring
串(string)(或字符串)是由零個或者多個字符組成的有限序列。
串的表示和實現
定長順序存儲表示
類似於線性表的順序存儲結構,用一組地址連續的存儲單元存儲串值的字符序列。 在串的定長順序存儲結構中,按照預定義的大小,爲每個定義的串變量分配一個固定長度的存儲區。 串的實際長度可在這預定義長度的範圍內隨意,超過預定義長度的串值則會被捨棄,稱之爲”截斷”。
堆分配存儲表示
以一組地址連續的存儲單元存放串值字符序列,但它們的存儲空間是在程序執行過程中動態分配而得。在C語言中, 存在一個稱之爲”堆”的自由存儲區,並由C語言的動態分配函數malloc()
和free()
來管理。
串的塊鏈存儲表示
和線性表的鏈式存儲結構相似,也可以採用鏈表方式存儲串值。由於串結構的特殊性,串結構中的每個數據元素是一個字符,則 用鏈表存儲串值時,存在一個”結點大小”的問題,即每個結點可以存放一個字符,也可以存放多個字符。
串的模式匹配算法
function index(fatStr,sonStr){
var fatStrLen = fatStr.length,
sonStrLen = sonStr.length,
gap = fatStrLen - sonStrLen,
i = 0;
while (i<=gap) {
for (var j = 0; j < sonStrLen; j++) {
if (fatStr.charAt(i+j)!==sonStr.charAt(j)) {
break;
}
}
if (j === sonStrLen) {
return i;
}else {
i++;
}
}
return -1;
}
模式匹配的一種改進算法
這種改進算法是 克努特,莫里斯,普拉特三人同時發現的,因此簡稱其爲KMP算法。 這種算法的改進在於每當一趟匹配過程中出現字符比較不等時,不需要回溯,而是利用已經得到的”部分匹配”的結果將模式 向右滑動儘可能遠的一段距離後,繼續進行比較。
function kmpGetNext(str) {
var len = str.length,
next = [0];
for (var i = 1; i < len; i++) {
var tmp = 0;
for (var j = 0; j < i; j++) {
if (str.slice(0, j + 1) == str.slice(i - j, i + 1)) {
tmp = j + 1;
}
}
next.push(tmp);
}
return next;
}
function kmp(fatStr, sonStr) {
var fatStrLen = fatStr.length,
sonStrLen = sonStr.length,
gap = fatStrLen - sonStrLen,
next = kmpGetNext(sonStr), //替代
i = 0,
j = 0;
while (i <= fatStrLen) {
if (fatStr.charAt(i) == sonStr.charAt(j)) {
i++;
j++;
} else if (j !== 0) {
j = next[j]; //如果j不等於0就讓j等於next[j]
} else {
i++; //j等於0,且不匹配,則i主串向右劃
}
if (j === sonStrLen - 1) { //當完全匹配時,返回i-j,即子串對應的序號
return i - j;
}
}
return -1;
}