现在的位置: 首页 > 综合 > 正文

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

2012年09月15日 ⁄ 综合 ⁄ 共 2402字 ⁄ 字号 评论关闭

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

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

基本思路:建立一个访问标志数组,初始化为访问次数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后,函数将返回9,outputstr所指的值为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) = ‘/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;

}

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

抱歉!评论已关闭.