數(shù)據(jù)結構五(串)

十一期間,項目比較緊,讓各位久等了

一.串的定義

:是由零個多個字符組成的有限序列,又名叫字符串
一般記為s = "a1,a2,a3......an",其中s是串的名字,用雙引號(有的書中也用單引號)括起來的字符序列是串的值.ai(1<= i <= n)可以是
字母,數(shù)字其他字符,i是該字符在串中的位置.串中的字符數(shù)目n稱為串的長度*
零個字符串稱為空串,它的長度為零,,可以直接用兩雙引號' " " '表示
序列:說明串的相鄰字符之間具有前驅和后繼的關系

空格串:只包含空格的串.它和空串是有區(qū)別的,空格串是有內(nèi)容長度的,而且不止一個空格

空串和空格串的區(qū)別

子串與主串:串中任意個數(shù)的連續(xù)字符組成的子序列稱為該串的子串,相應地,包含子串的串稱為主串
子串在主串中的位置就是子串的第一個字符在主串的序號

子串和主串

二.串的比較

數(shù)字很容易比較大小.字符串的大小比較取決于他們每個字母的前后順序和字符串的長度

字符串比較一
字符串比較二
字符串比較三
字符串比較四

字符串比較總結:

  • 1.字符串相等
    必須他們串的長度以及他們各個對應位置的字符都等時,才算相等.即給定兩個串:s = "a1, a2, a3 ......an", t = "b1, b2 , b3 ....bm",當且僅當n = m,且a1= b1,a2 = b2,a3 = b3......an = bm滿足時.我們認為s = t
  • 2.字符串不相等
    給定兩個串:s = "a1, a2, a3......an", t = "b1,b2,b3......bm",當滿足以下條件任意一個,s < t
    1)n < m,a1 = b1 (i = 1,2,......,n),比如圖字符串比較四
    2)存在某個k <= min(m, n),使得ai = bi(i = 1, 2 .......k -1),ak < bk,如字符串比較圖1,2

三.串的抽象數(shù)據(jù)類型

串的邏輯結構和線性表很相似.不同之處在于串針對的是字符集,也就是中的元素都是字符,比如"123""2010-10-10",這也只能理解為長度為3和長度為10的字符串,每個元素都是字符
線性表關注的是單個元素的操作,比如查找一個元素,插入或刪除一個元素
中更多的是查找子串位置,得到指定位置子串,替換子串等操作

ADT 串(string)
Data 
      串中元素僅由一個字符組成,相鄰元素具有前驅和后繼關系
Operation   
       StrAssign(T,*chars):生成一個其值等于字符串常量chars的串T
       StrCopy(T,S):若S存在,由串S賦值得串T
       ClearString(S):若串存在,將串清空
       StringEmpty(S):若串S為空,返回true,否則返回false
       StrLength(S):返回串S的元素個數(shù),即串的長度
       StrCompare(S,T):若S > T,返回值 > 0,若S = T,返回0,若 S < T,返回值 <0
       Concat(T,S1,S2):用T返回由S1和S2連接而成的新串
       SubString(Sub,S,pos,len):串S存在,1 <= pos <= StrLength(S),且0<= len <= StrLength(s) - post +1,用Sub返回串S的第post個字符起長度為len的子串  
         Index(S,T,pos):串S和T存在,T是非空串,1 <= post <= StrLength(s).若主串S中存在和串T值相同的子串,則返回它在主串S中第post個字符之后第一次出現(xiàn)的位置,否則返回0
         Replace (S,T,V):串S,T,V存在,T是非空串.用V替換主串S中出現(xiàn)的所有與T相等的不重疊的子串
         StrInsert(S,pos,T):串S和T存在,1<= pos <= StrLength(S) + 1.在串S的第pos個字符之前插入串T
         StrDelete(S,post,len):串S存在,1<=pos <= Strlength(S) - len + 1.從串S中刪除第pos個字符起長度為len的子串
    endADT

實現(xiàn)算法

//T為非空串,若主串S中第pos個字符之后存在與T相等的子串
//則返回第一個這樣的子串在S中的位置,否則返回0
int Index (String S , String T, int pos){
      int n ,m ,i;
      String sub;
      if (pos > 0)[
            n = StrLength(S);//得到主串S的長度
            m = StrLength(T);//得到子串T的長度
            i = pos;
            while (i <= n - m + 1){
                    SubString(sub, S,i,m);//取主串第i個位置,長度與T相等的子串給sub
                    if (StrCompare (sub,T) != 0)//如果兩串不相等
                            ++i;
                     else 
                              return i ; //如果兩串相等返回i值
              }
          }
        return 0; //若無子串與T相等,返回0
     }

四.串的存儲結構

1.串的順序存儲結構

串的順序存儲結構是用一組地址連續(xù)的存儲單元來存儲串中的字符序列.按照預定義的大小,為每個定義的串變量分配一個固定長度的存儲單元.一般用定義長數(shù)組來定義
它規(guī)定在串值后面加一個不計入串長度的結束標記字符,比如"\0"來表示串值的終結

串的長度

串的順序存儲長度的缺點:串的長度超過數(shù)組的長度MaxSize,超出部分就不在顯示

2.串的鏈式存儲

串的鏈式存儲結構,與線性表是相似的,結構中的每個元素數(shù)據(jù)都是一個字符,如果一個結點對應一個字符,就會存在很大的空間浪費.因此,一個結點可以存放一個字符,也可以存放多個字符,最后一個結點未被占滿時,可以用"#"或其他串值字符補全

串的鏈式

五.樸素的模式匹配算法

子串的定位操作通常稱作串的模式匹配,應該算是串中最重要的操作之一
假設我們要從下面的主串S = "goodgoogle"中,找到T="google"這個子串的位置,我們需要下面的步驟
1.從主串的第一位開始,此次與T進行匹配.S與T的前三個字母都匹配成功,但是S的第四個字母是d,T的第四個字母是g,第一位匹配失敗.豎直連線表示相等,??表示不等

第一位比較

2.主串S的第二位開始,主串S的首字母是o,要匹配的T首字母是g,匹配失敗

第二位比較

3.主串S的第三位開始,主串S的首字母是o,要匹配的T首字母是g,匹配失敗

第三位

4.主串S的第四位開始,主串S的首字母是d,要匹配的T首字母是g,匹配失敗


第四位

5.主串S的第五位開始,S與T,6個字母全匹配成功,終于成功了..此處應該有掌聲~??????

歷經(jīng)千山萬水,重要找到你了

思路:

  • 1.對主串進行大循環(huán)

  • 2.對子串進行小循環(huán)

    //主串S和子串T的長度存在S[0]和T[0]中
    //返回子串T在主串S中pos個字符之后的位置,若不存在,則函數(shù)返回值為0
    //T非空,1 <= pos <= StrLength(S)
    int Index (String S , String T, int pos){
          int i = pos;//i用于主串中當前位置下標,若pos不為1,則從pos位置開始匹配
           int j = 1; //j用于子串T當前位置下標值
          while(i <= S[0] && j<= T[0]){//若i小于S長度且j小于T的長度時循環(huán)
                if (S[i] == T[j])//兩字母相等則繼續(xù)
                  {
                         ++i;
                         ++j;
                   }else{ //指針后退重新開始匹配
                       i = i - j + 2;//i返回到上次匹配首位的下一位
                       j = 1; //j返回到子串T的首位
                    }
                }
                if (j > T[0]) 
                       return i - T[0];
                 esle 
                       return 0;
     }
    

最好情況: 一次就成功 ,時間復雜度為O(1)
稍差一點:就想剛才例子中,第二,三,四位一樣,每次都首字母就不匹配,那么對T串的循環(huán)就不必進行,比如"abcdefgoole"中,去找"goole",那么時間復雜度為O(n + m) ,其中n為主串長度,m為子串長度 ........這里始終認為是O(n -m + 1),坐等大神解釋

A75441B7-6BCA-46C2-BB53-F6BCE03E94BF.jpg

最壞情況:每次不成功的匹配都發(fā)生在串T的最后一個字符.舉個很極端的例子,主串S = "0000000000000000000000000000000000000000000000000001",而要匹配的子串為T ="0000000001",前者有49個"0"和1個"1"的主串,后者是9個"0"和1個"1"的子串,在匹配是.每次都將T中的字符循環(huán)到最后一位才發(fā)現(xiàn):他們不匹配.這樣等于T串需要在S串的前40個位置都需要判斷10次,并得出不匹配的結論

2.png

直到最后41個位置,因為全部匹配相等,所以不需要再繼續(xù)進行下去.如果最終沒有可匹配的子串,比如T = "0000000002",到第41位置判斷不匹配后同樣不需要在進行對比下去了.因此最壞情況的時間復雜度為O(n - m + 1) * m

3.png
KMP模式匹配算法看的不是很理解,以后會專門補上單獨的一章
屏幕快照 2016-10-11 下午1.56.54.png
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扑眉,一起剝皮案震驚了整個濱河市氓奈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌氢惋,老刑警劉巖怎静,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘴秸,死亡現(xiàn)場離奇詭異骏令,居然都是意外死亡谤辜,警方通過查閱死者的電腦和手機芦缰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門企巢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人让蕾,你說我怎么就攤上這事浪规。” “怎么了探孝?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵笋婿,是天一觀的道長。 經(jīng)常有香客問我顿颅,道長缸濒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任粱腻,我火速辦了婚禮庇配,結果婚禮上,老公的妹妹穿的比我還像新娘绍些。我一直安慰自己捞慌,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布柬批。 她就那樣靜靜地躺著啸澡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氮帐。 梳的紋絲不亂的頭發(fā)上锻霎,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音揪漩,去河邊找鬼旋恼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的冰更。 我是一名探鬼主播产徊,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜀细!你這毒婦竟也來了舟铜?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤奠衔,失蹤者是張志新(化名)和其女友劉穎谆刨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體归斤,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡痊夭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脏里。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片她我。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖迫横,靈堂內(nèi)的尸體忽然破棺而出番舆,到底是詐尸還是另有隱情,我是刑警寧澤矾踱,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布恨狈,位于F島的核電站,受9級特大地震影響呛讲,放射性物質發(fā)生泄漏禾怠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一圣蝎、第九天 我趴在偏房一處隱蔽的房頂上張望刃宵。 院中可真熱鬧衡瓶,春花似錦徘公、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至十厢,卻和暖如春等太,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛮放。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工缩抡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人包颁。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓瞻想,卻偏偏與公主長得像压真,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蘑险,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容