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 ( ------------ ) {
for ( j = 0 ; j < id ; j++) ch[k++] = temp.ch[j] ; // 摘取 temp.ch 中匹配位置
if ( ------------------------------------- )
l = v.curLen ; // 确定替换串 v 传送字符数 l
else l = maxLen - curLen - id ;
for ( j = 0 ; j < l ; j++ ) --------------------------- = v.ch[j] ; // 连接替换串 v 到结果串 ch 后面
curLen += id + l ; // 修改结果串连接后的长度
if ( curLen == maxLen ) break; // 字符串超出范围
for ( j = id + t.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( ) ;
测试数据 s = "cast cast sat at a tasa\0"
测试结果:
【另一 解答 】
include <iostream.h>
include "string.h"
const int charnumber = 128; /*ASCII 码字符集的大小 */
void frequency( String & s , int& C[ ] ) {
// s 是输入字符串,数组 C[ ] 中记录每一种字符的出现次数。
5 -3 设串 s 为 “aaab” ,串 t 为 “abcabaa” ,串 r 为 “abc aabbabcabaacbacba” ,试分别计算它们的失效函数 f (j) 的值。
【 解答 】
答案
>>返回 |