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