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; }