C/C++面试之算法系列--几个最大子字符串的算法题

 

<?xml:namespace prefix = o ns = “urn:schemas-microsoft-com:office:office” />

 

几个最大子字符串的算法题

 

××××××××××××××××××××××××××××××××××

统计一个字符串中所有字符出现的次数

 

基本思路:建立一个访问标志数组,初始化为访问次数0,每访问一次,将其增1  

static   int     count[128];  

遍历字符串数组,每次读取一个字符ch; count[ch]++; 这样只要遍历一次数组就行了。在最后把count[i]==0的去掉即可

 

#include   <iostream>

using   namespace   std;

int   main()

{  

        int  count[255] ={0};

        char  *pstrTemp = “243567867867867”;

       

        do

        {

                count[*pstrTemp]++;

        }while (*(++pstrTemp));

 

        for(int i = 0; i < 255; ++i)

        {  

                if (count[i] != 0)

                cout <<  “character:” << (char)i <<“  number:” << count[i] << endl;

        }  

}

××××××××××××××××××××××××××××××××××

 

求最大的相同字符子串(由同一个字符组成)

 

不处理相同最大字符串的情况,可处理仅一个字符的情况。求出每个字母对应的最长字串

默认为只处理大写字母,否则可以将26更改为128即可

void ddStrSame(char * ch)

{

        int TempCH[26];

        int i,MaxLen =1,count=1;

        char Curchar;

 

        for(i=0;i<26;i++)       // 将每个字符的初始访问次数置为0

                TempCH[i] = 0;

 

        //第一个应单独处理,防止下面越界

        TempCH[*ch-0x61]++;

        Curchar = *ch++;  // 若字符串只有一个字符时,此时很重要

 

        while(*ch != ‘/0’)

        {

                // 与上一个相同时,增加计数1,若不同,则更新当前字符的最大访问次数

                if(*ch == *(ch-1))  //

                {

                       count++;

                }

                else

                {

                       if( count > TempCH[*(ch-1)-0x61])

                       {

                               TempCH[*(ch-1)-0x61] = count; 

 

                                if(MaxLen < count) // 当前字符的最大计数大于所有字符中的最大计数,则/更新最大计数及对应的字符

                               {

                                       MaxLen = count;

                                       Curchar = *(ch-1);

                               }

                       }

                       count = 1;  // 以便对下一个字符计数

 

                }

                ch++;

        }

 

        if( count > TempCH[*(ch-1)-0x61])

        {

                TempCH[*(ch-1)-0x61] = count; 

 

                if(MaxLen < count) // 当前字符的最大计数大于所有字符中的最大计数,则/更新最大计数及对应的字符

                {

                       MaxLen = count;

                       Curchar = *(ch-1);

                }

        }

        printf(“Character = %c/tNumber = %d/n”,Curchar,MaxLen);

}

 

void main()

{     

        ddStrSame(“b”);

        ddStrSame(“abcdddddaaaaabbbeefffda”);

        ddStrSame(“aabcdddaaaaabbbeefffda”);

        ddStrSame(“aaaaaabcdddaaaaabbbeefffda”);

        ddStrSame(“aaabcdddaaaaabbbeefffdaaaaaa”);

        ddStrSame(“aaabcdddaaaaabbbeeffffffffffffdaaaaaab”);

 

        system(“pause”);

}

 

××××××××××××××××××××××××××××××××××

 

写一个函数,它的原形是int FindMaxIntStr(char *outputstr,char *intputstr)

 

功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:“abcd12345ed125ss123456789”的首地址传给intputstr后,函数将返回9outputstr所指的值为123456789

 

// 不处理含相同长度的最长子串,若有,则返回的是第一次出现的最长字串

int FindMaxIntStr (char *outputstr, char *inputstr)

{

char *in = inputstr, *out = outputstr, *temp, *final;

int count = 0, maxlen = 0;

 

while( *in != ‘/0’ )

{

if( *in >= ‘0’ && *in <= ‘9’ )

{

for(temp = in; *in >= ‘0’ && *in <= ‘9’; in++ )

count++;

if( maxlen < count )

{

maxlen = count;

//count = 0;

final = temp; // temp保存了当前连续最长字串的首地址,final是总的最长

*(final+count) = ‘/<?xml:namespace prefix = st1 ns = “urn:schemas-microsoft-com:office:smarttags” />0’; //  给字符串赋上结束符

}

count = 0; // 不管当前累计的最长数字是否大于前面最长的,都应该清除count,以便下/次计数

}

//else 不管上面的if是否进入,到此处时*in肯定不是数字

in++;

}

// 上述比较过程只保存了最长字串在输入数组中对应的地址,避免了反复拷贝到输出数组/的过程

 

for(int i = 0; i < maxlen; i++)     // 将最终的最长字串保存到输出数组

{

*out++ = *final++;

}

*out = ‘/0’;

return maxlen;

}

int main()

{

        char input[] = “abcd12345ed125ss0123456789”;

        char output[50] = {0};

        unsigned int maxlength = FindMaxIntStr (output, input);

 

        cout << output <<endl <<maxlength<<endl;

        return 0;

}

××××××××××××××××××××××××××××××××××

 

    原文作者:杨帆_8318
    原文地址: https://blog.csdn.net/sailor_8318/article/details/3066329
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞