2-14 字符串的替换操作replace(String &s, String &t, String &v) 是指:若t是s的子串,则用串v替换t在串s中的所有出现;若t不是s的子串,则串s不变。试利用字符串的基本运算实现这个替换操作。
基本思路:s串中寻找t的匹配,找到後,在t处将t去掉,正好把s串一分为二,上半段接上目标串v,下半段继续寻找t的匹配,然后重复以上操作,并把前半段加入上一次操作的上一段。最后将上下两段合并,即完成所需要的replace操作。
所有操作均利用书上字符串类所给的公共函数实现

void Replace(String &s, String &t, String &v){
String tmp; //建立临时子串,存放上半段
while (int pos=s.Find(t) != -1){
tmp += s(0,pos) += v; //链入上半段和v
s=s(pos+t.length(),s.length()-pos-t.length());//产生s下半段
}
if (tmp.length()){ //如果没有替换声明一下
cout << "未找到可替换的子串" << endl;return;
}
else { s = tmp += s;return;} //整合
}

与参考答案相比,几乎完全不一样,这里的replace操作是一个独立的操作,s也作为一个变量。
另外题目要求利用字符串的基本运算操作,我的理解是利用那些公共函数,而不该去用存储结构部分。在一般情况下,这个replace函数不会放在类里。或者会成为一个新的类的函数。

2-16 设串s为“aaab”,串t为“abcabaa” ,串r 为"abcaabbabcabaacbacba",试分别计算他们的失效函数f(j)的值。
解:
"aaab" f(0)=-1 f(1)=0 f(2)=1 f(3)=-1
"abcabaa" f(0)=-1 f(1)=-1 f(2)=-1 f(3)=0
f(4)=1 f(5)=0 f(6)=0
"abcaabbabcabaacbacba"
f(0)=-1 f(1)=-1 f(2)=-1 f(3)=0 f(4)=0 f(5)=1
f(6)=-1 f(7)=-1 f(8)=1 f(9)=2 f(10)=3 f(11)=-1
f(12)=0 f(13)=0 f(14)=-1 f(15)=-1 f(16)=0 f(17)=-1
f(18)=-1 f(19)=0

ps:题目里有个空格,不过我想空格也只不过相当于个符号,去之。练习。

2-17 没太理解题目的意思,是再抄一遍p66 p67 呢 还是要用纯粹的数学上的方法证明?
感觉这离开模式匹配的环境就没有意义了。

Comments (0)