串 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;
}
發佈了49 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章