5-1 字符串的替换操作replace (String &s,String &t,String &v)是指:若t是s的子串,则用串v替换串t在串s中的所有出现;若t不是s的子串,则串s不变。例如,若串s为“aabbabcbaabaaacbab”,串t为“bab”,串v为“abdc”,则执行replace操作后,串s中的结果为“aababdccbaabaaacabdc”。试利用字符串的基本运算实现这个替换操作。
【解答】
String & String,,Replace ( String & t,String &v) {
if ( ( int id = Find ( t ) ) == -1 ) //没有找到,当前字符串不改,返回
{ cout << "The (replace) operation failed." << endl; return *this; }
String temp( ch ); //用当前串建立一个空的临时字符串
ch[0] = '\0'; curLen = 0; //当前串作为结果串,初始为空
int j,k = 0,l; //存放结果串的指针
while ( id != -1 ) {
for ( j = 0; j < id; j++) ch[k++] = temp.ch[j]; //摘取temp.ch中匹配位置
if ( curLen+ id + v.curLen <= maxLen )
l = v.curLen; //确定替换串v传送字符数l
else l = maxLen- curLen- id;
for ( j = 0; j < l; j++ ) ch[k++] = v.ch[j]; //连接替换串v到结果串ch后面
curLen += id + l; //修改结果串连接后的长度
if ( curLen == maxLen ) break; //字符串超出范围
for ( j = id + t.curLen; j < temp.curLen; j++ )
temp.ch[j- id - t.curLen] = temp.ch[j]; //删改原来的字符串
temp.curLen -= id + t.curLen;
id = temp.Find ( t );
}
return *this;
}
5-2 编写一个算法frequency,统计在一个输入字符串中各个不同字符出现的频度。用适当的测试数据来验证这个算法。
【解答】
include <iostream.h>
include "string.h"
void frequency( String& s,char& A[ ],int& C[ ],int &k ) {
// s是输入字符串,数组A[ ]中记录字符串中有多少种不同的字符,C[ ]中记录每
//一种字符的出现次数。这两个数组都应在调用程序中定义。k返回不同字符数。
int i,j,len = s.length( );
if ( !len ) { cout << "The string is empty," << endl; k = 0; return; }
else { A[0] = s[0]; C[0] = 1; k = 1; /*语句s[i]是串的重载操作*/
for ( i = 1; i < len; i++ ) C[i] = 0; /*初始化*/
for ( i = 1; i < len; i++ ) { /*检测串中所有字符*/
j = 0;
while ( j < k && A[j] != s[i] ) j++; /*检查s[i]是否已在A[ ]中*/
if ( j == k ) { A[k] = s[i]; C[k]++; k++ } /*s[i]从未检测过*/
else C[j]++; /*s[i]已经检测过*/
}
}
}
测试数据 s = "cast cast sat at a tasa\0"
A
c
a
s
t
b
C
2
7
4
5
5
【另一解答】
include <iostream.h>
include "string.h"
const int charnumber = 128; /*ASCII码字符集的大小*/
void frequency( String& s,int& C[ ] ) {
// s是输入字符串,数组C[ ]中记录每一种字符的出现次数。
for ( int i = 0; i < charnumber; i++ ) C[i] = 0; /*初始化*/
for ( i = 0; i < s.length ( ); i++ ) /*检测串中所有字符*/
C[ atoi (s[i]) ]++; /*出现次数累加*/
for ( i = 0; i < charnumber; i++ ) /*输出出现字符的出现次数*/
if ( C[i] > 0 ) cout << "( " << i << " ), \t" << C[i] << "\t";
}
5-3 设串s为“aaab”,串t为“abcabaa”,串r为“abc(aabbabcabaacbacba”,试分别计算它们的失效函数f (j)的值。
【解答】
j
0
1
2
3
j
0
1
2
3
4
5
6
s
a
a
a
b
t
a
b
c
a
b
a
a
f (j)
-1
0
1
-1
f (j)
-1
-1
-1
0
1
0
0