1 写一函数int fun(char *p)判断一字符串是否为回文 bool isHuiwen(const char *str);
2 字符串逆序:char *inverseString(char *str);
3 求字符串中出现频率最高的字符 :char maxCountChar_string(const char *str);
4 写出在母串中查找子串 出现次数的代码:int subNum_string(const char *str,const char *substring);
5 编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh” :void loopMoveNum(char *pStr,int steps);
6 找字符串中最长对称串:从最长的开始找起来--char *maxLenHuiwen(char *pStr);
7 求字符串中对称串的个数(和最长的对称串相对应的):int countHuiwen(const char *pStr);
=========================================================================================
1 写一函数int fun(char *p)判断一字符串是否为回文 bool isHuiwen(const char *str);
// (str[i],str[len-1-i])比较 bool isHuiwen( const char *str ) { //// 1 使用 字符数组的形式。 //assert(str!=NULL); //bool isTrue=true; //int len=strlen(str); //for(int i=0;i<len/2;i++) //{ // if(str[i]!=str[len-1-i]) // { // //cout<<"bushi huiwen"<<endl; // isTrue= false; // break; // } //} //return isTrue; //2 使用指针的形式。 assert(str!=NULL); bool isTrue=true; int len=strlen(str); char *q=(char*)str+len-1; //对于有const的指针,需要使用(cahr*)的形式。 while(str<q) { if(*str!=*q) { isTrue=false; cout<<"bushi huiwen"<<endl; break; } str++; q--; } return isTrue; }
2 字符串逆序:char *inverseString(char *str);
//(str[i],str[len-1-i])交换 char * inverseString( char *str ) { ////2 使用指针的形式。 //assert(str!=NULL); //int len=strlen(str); //char *q=(char*)str+len-1; //对于有const的指针,需要使用(cahr*)的形式。 //char *add=str; //char tmp; //while(str<q) //{ // tmp=*str; // *str=*q; // str++; //往中间靠拢。 // q--; //} //cout<<"转化后的字符串是:"<<add; //return add; assert(str!=NULL); int len=strlen(str); char tmp,*add=str; for(int i=0;i<len/2;i++) { tmp=str[i]; str[i]=str[len-1-i]; str[len-1-i]=tmp; } cout<<"转化后的字符串是:"<<add<<endl; return add; }
3 求字符串中出现频率最高的字符 :char maxCountChar_string(const char *str);
//有待改进(可以使用map 之类的进行整合) char maxCountChar_string( const char *str ) { assert(str!=NULL); int allchar[26]={0}; //假设是26个小写字母,其他的呢???(重点) int maxNum=1; char *t=(char*)str,maxchar=*str; while(*t!='\0') { allchar[*t-'a']++; if(allchar[*t-'a']>maxNum) { maxchar=*t; maxNum=allchar[*t-'a']; } t++; } cout<<"The max number of char is "<<maxchar<<"---"<<maxNum<<endl; return maxchar; }
4 写出在母串中查找子串 出现次数:int subNum_string(const char *str,const char *substring);
//就是在 字符串匹配的基础上加上计数的功能:可以使用 递归的吧??? int subNum_string( const char *src,const char *dest ) { assert(src!=NULL&&dest!=NULL); int len1,len2; len1=strlen(src); len2=strlen(dest); int count=0; for(int i=0;i<len1;i++) { for(int j=0;j<len2;j++) { if(src[i+j]!=dest[j]) { break; //只是推出 内层循环 } if(j==len2-1) { //i+len2-1=i+j /*printf("The location is %d--%d\n",i,i+j);*/ count++; cout<<"第"<<count<<"个字符串的位置"<<i<<"--"<<i+j<<endl; j=0; break; //跳出内层的循环,否则无线循环下去 } } } cout<<"共有"<<count<<"个字符串!!!"<<endl; return count; }
5 编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh” :void loopMoveNum(char *pStr,int steps);
void loopMoveNum( char *pStr,int steps ) { ////1 memcpy 的方式得到:1 需要移动的tmp 2 前面的往后面移动 3 tmp补上位置。 //int lenRest=strlen(pStr)-steps; //char *tmp; //tmp=(char*)malloc((steps+1)*sizeof(char)); //assert(tmp!=NULL); //heheei123----123(tmp)----heh heheei(pStr)----123 heheei(pStr) //memcpy(tmp,pStr+lenRest,steps); //memcpy(pStr+steps,pStr,lenRest); //memcpy(pStr,tmp,steps); //free(tmp); //tmp=NULL; //cout<<"右移动后的字符串是"<<pStr<<endl; //2 使用 strcpy的方式得到。 int lenRest=strlen(pStr)-steps; char *tmp; tmp=(char*)malloc((steps+strlen(pStr)+1)*sizeof(char)); assert(tmp!=NULL); //heheei123----123(tmp)----123 heheei123(tmp)----123heei strcpy(tmp,pStr+lenRest); strcpy(tmp+steps,pStr); *(tmp+strlen(pStr))='\0'; strcpy(pStr,tmp); free(tmp); tmp=NULL; cout<<"右移动后的字符串是"<<pStr<<endl; }
6 找字符串中最长对称串:从最长的开始找起来--char *maxLenHuiwen(char *pStr);
//从最长的开始找起,知道知道的话,退出循环,保存起始的位置以及长度。 char * maxLenHuiwen( char *pStr ) { assert(pStr!=NULL); int lenStr=strlen(pStr); if(lenStr==1) { cout<<"只有一个字符,亲!!"<<endl; return pStr; } char *tmp; //stringProcess strProc; for(int n=lenStr;n>1;n--) { for(int m=0;m<=lenStr-n;m++) { tmp=new char[n+1]; memcpy(tmp,pStr+m,n); *(tmp+n)='\0'; //strProc.strncpy1(tmp,pStr+m,n); //使用自己编写的类,具有重大的意义。 if(isHuiwen(tmp)) { cout<<"最大的对称串是"<<tmp<<",长度为"<<n<<endl; return tmp; } } //delete []tmp; } cout<<"很抱歉,没有找到对称的字符串!!!"<<endl; return NULL; }
7 求字符串中对称串的个数(和最长的对称串相对应的):int countHuiwen(const char *pStr);
//从小到大(或者是从大到小)的顺序:找到一个加上一个的 数量,而不是break; int countHuiwen(const char *pStr ) { assert(pStr!=NULL); int count=0; int len=strlen(pStr); if(len==1) { cout<<"只有一个字符,亲!!"<<endl; return 1; } char *tmp; for(int num=2;num<=len;num++) //num:对称串的长度 { for(int m=0;m<=len-num;m++) { tmp=new char[num+1]; //memcpy(tmp,pStr+m,num); strncpy(tmp,pStr+m,num); *(tmp+num)='\0'; if(isHuiwen(tmp)) { count++; cout<<"第"<<count<<"个对称串是"<<tmp<<",起始位置是"<<m<<",长度为"<<num<<endl; } } delete []tmp; } cout<<"对称串的个数是:"<<count<<endl; return count; }
测试代码
int main() { //char str[]="heeheei123"; //isHuiwen(str); //inverseString(str); /*maxCountChar_string(str);*/ /*char str1[]="hahahanihaohah"; char str2[]="hah"; subNum_string(str1,str2);*/ //loopMoveNum(str,3); char str[]="heehee"; //maxLenHuiwen(str); countHuiwen(str); return 0; }