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