字符串的处理2

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


你可能感兴趣的:(字符串,处理)