<?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后,函数将返回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) = ‘/<?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;
}
××××××××××××××××××××××××××××××××××