習題集解析部分
第4章 串
——《數據結構題集》-嚴蔚敏.吳偉民版
源碼使用說明 鏈接☛☛☛ 《數據結構-C語言版》(嚴蔚敏,吳偉民版)課本源碼+習題集解析使用說明
課本源碼合輯 鏈接☛☛☛ 《數據結構》課本源碼合輯
習題集全解析 鏈接☛☛☛ 《數據結構題集》習題解析合輯
相關測試數據下載 鏈接☛ 數據包
本習題文檔的存放目錄:數據結構\▼配套習題解析\▼04 串
文檔中源碼的存放目錄:數據結構\▼配套習題解析\▼04 串\▼習題測試文檔-04
源碼測試數據存放目錄:數據結構\▼配套習題解析\▼04 串\▼習題測試文檔-04\Data
一、基礎知識題
4.1❶簡述空串和空格串(或稱空格符串)的區別。
4.2❷對於教科書4.1節中所述串的各個基本操作,討論是否可由其他基本操作構造而得,如何構造?
4.3❶設s = ‘I AM A STUDENT’,t = ‘GOOD’,q = ‘WORKER’。
求:StrLength(s),StrLength(t),SubString(s, 8, 7),SubString(t, 2, 1),Index(s, ‘A’),Index(s, t),Replace(s, ‘STUDENT’, q),Concat(SubString(s, 6, 2), Concat(t, SubString(s, 7, 8)))。
4.4❶已知下列字符串
a = ‘THIS’, f = ‘A SAMPLE’, c = ‘GOOD’, d = ‘NE’, b = ‘ ’.
s = Concat(a, Concat(SubString(f, 2, 7), Concat(b, SubString(a, 3, 2)))),
t = Replace(f, SubString(f, 3, 6), c),
u = Concat(SubString(c, 3, 1), d),
g = ‘IS’,
v = Concat(s, Concat(b, Concat(t, Concat(b, u)))),
試問:s,t,v,StrLength(s),Index(v, g),Index(u, g)各是什么?
4.5❶試問執行以下函數會產生怎樣的輸出結果?
void demonstrate()
{
StrAssign(s, ‘THIS IS A BOOK’);
Replace(s, SubString(s, 3, 7), ‘ESE ARE’);
StrAssign(t, Concat(s, ‘S’));
StrAssign(u, ‘XYXYXYXYXYXY’);
StrAssign(v, SubString(u, 6, 3));
StrAssign(w, ‘W’);
printf(‘t=’, t, ‘v=’, v, ‘u=’, Replace(u, v, w));
}//demonstrate
4.6❷已知:s = ‘(XYZ)+*’,t = ‘(X+Z)*Y’。試利用聯接、求子串和置換等基本運算,將s轉化為t。
4.7❷令s = ‘aaab’,t = ‘abcabaa’,u = ‘abcaabbabcabaacbacba’。試分別求出它們的next函數值和nextval函數值。
4.8❷已知主串s = ‘ADBADABBAABADABBADADA’,
模式串pat = ‘ADABBADADA’,
寫出模式串的nextval函數值,並由此畫出KMP算法匹配的全過程。
4.9❸在以鏈表存儲串值時,存儲密度是結點大小和串長的函數。假設每個字符占一個字節,每個指針占4個字節,每個結點的大小為4的整數倍,已知串長的分布函數為f(l)且,求結點大小為4k,串長為l時的存儲密度d(4k, l)(用公式表示)。
二、算法設計題
在編寫4.10至4.14題的算法時,請采用StringType數據類型:
StringType是串的一個抽象數據類型,它包含以下五種基本操作:
void StrAssign (StringType &t, StringType s); //將s的值賦給t。s的實際參數可以是串變量或者串常量(如:‘abcd’)。
int StrCompare (StringType s, StringType t); //比較s和t。若s>t,返回值>0;若s=t,返回值=0;若s<t,返回值<0。
int StrLength (StringType s); //返回s中的元素個數,即該串的長度。
StringType Concat (StringType s, StringType t); //返回由s和t聯接而成的新串。
StringType SubString (StringType s, int start, int len) ; //當1≤start≤StrLength(s)且0≤len≤StrLength(s)-start+1時,返回s中第start個字符起長度為len的子串,否則返回空串。
順序串
4.10❸編寫對串求逆的遞推算法。
4.11❸編寫算法,求得所有包含在串s中而不包含在串t中的字符(s中重復的字符只選一個)構成的新串r,以及r中每個字符在s中第一次出現的位置。
4.12❸編寫一個實現串的置換操作Replace(&S, T, V)的算法。
4.13❸編寫算法,從串s中刪除所有和串t相同的子串。
4.14❹利用串的基本操作以及棧和集合的基本操作,編寫“由一個算術表達式的前綴式求后綴式”的遞推算法(假設前綴式不含語法錯誤)。
在編寫4.15至4.20題的算法時,請采用教科書4.2.1節中所定義的定長順序存儲表示,而不允許調用串的基本操作。
4.15❸編寫算法,實現串的基本操作StrAssign(&T, chars)。
4.16❸編寫算法,實現串的基本操作StrCompare(S, T)。
4.17❸編寫算法,實現串的基本操作Replace(&S, T, V)。
4.18❸編寫算法,求串s所含不同字符的總數和每種字符的個數。
4.19❸在串的定長順序存儲結構上直接實現4.11題要求的算法。
4.20❸編寫算法,從串s中刪除所有和串t相同的子串。
塊鏈串
4.21❹假設以結點大小為1(且附設頭結點)的鏈表結構表示串。試編寫實現下列六種串的基本操作StrAssign,StrCopy,StrCompare,StrLength,Concat和SubString的函數。
4.22❹ 假設以塊鏈結構表示串。試編寫將串s插入到串t中某個字符之后的算法(若串t中不存在此字符,則將串s聯接在串t的末尾)。
4.23❹假設以塊鏈結構作串的存儲結構。試編寫判別給定串是否具有對稱性的算法,並要求算法的時間復雜度為O(StrLength(S))。
堆串
在編寫4.24至4.26題的算法時,請采用教科書4.2.2節中所定義的堆分配存儲表示。
4.24❸試寫一算法,在串的堆存儲結構上實現串基本操作Concat(&T, s1,s2)。
4.25❸試寫一算法,實現堆存儲結構的串的置換操作Replace(&S, T, V)。
4.26❸試寫一算法,實現堆存儲結構的串的插入操作 StrInsert(&S, pos, T)。
順序串
4.27❸當以教科書4.2.1節中定義的定長順序結構表示串時,可如下所述改進定位函數的算法:先將模式串t中的第一個字符和最后一個字符與主串s中相應的字符比較,在兩次比較都相等之后,再依次從t的第二個字符逐個比較。這樣做可以克服算法Index(算法4.5)在求模式串’akb’(ak表示連續k個字符’a’)在主串’anb’(k≤n)中的定位函數時產生的弊病。試編寫上述改進算法,並比較這兩種算法在作Index(’anb’,’akb’)運算時所需進行的字符間的比較次數。
塊鏈串
4.28❹假設以結點大小為1(帶頭結點)的鏈表結構表示串,則在利用next函數值進行串匹配時,在每個結點中需設三個域:數據域chdata、指針域succ和指針域next。其中chdata域存放一個字符;succ域存放指向同一鏈表中后繼結點的指針;next域在主串中存放指向同一鏈表中前驅結點的指針;在模式串中,存放指向當該結點的字符與主串中的字符不等時,在模式串中下一個應進行比較的字符結點(即與該字符的next函數值相對應的字符結點)的指針,若該節點字符的next函數值為0,則其next域的值應指向頭結點。試按上述定義的結構改寫求模式串的next函數值的算法。
4.29❹試按4.28題定義的結構改寫串匹配的改進算法(KMP算法)。
順序串
4.30❺假設以定長順序存儲結構表示串,試設計一個算法,求串s中出現的第一個最長重復子串及其(第一次出現的)位置,並分析你的算法的時間復雜度。
4.31❺假設以定長順序存儲結構表示串,試設計一個算法,求串s和串t的一個最長公共子串,並分析你的時間復雜度。若要求第一個出現的最長公共子串(即它在串s和串t的最左邊的位置上出現)和所有的最長公共子串,討論你的算法能否實現。