题目是说给定一个字符串,找其中非重复子字符串的最大长度.
我随机产生了0-9,大写字母,小写字母的ASCII码值组成一个长度60的字符串(保证有重复字符出现),然后是用char数组来实现的.string和char数组之间很容易转换.
#define random(a,b) (rand()%(b-a+1)+a)
#define MAX_NUM 60 //定义字符串长度
#define MAX_NUM 60 //定义字符串长度
int _tmain(int argc, _TCHAR* argv[])
{
srand((unsigned)time(NULL));
char orgChar[MAX_NUM];
for (int i=0;i<MAX_NUM-1;i++)
{
//产生大写字母、小写字母
int tmpInt=random(65,122);
while ((tmpInt>90)&&(tmpInt<97))
{
tmpInt=random(65,122);
}
orgChar[i]=(char)tmpInt;
}
orgChar[MAX_NUM-1]='\0';
string s;
s=orgChar;
printf("%s\n",orgChar);
cout<<s.c_str()<<endl;
printf(" %d",s.length());
int pos=0;
int len=0;
char analyze[MAX_NUM]={'\0'};
while (pos<s.length())
{
char tmp=s[pos];
if (analyze[0]=='\0') //第一个字符直接填入
{
analyze[0]=tmp;
}
else
{
bool reset=false;
int i;
printf("\n %d %s",pos,analyze);
for (i=0;i<MAX_NUM-1;i++)
{
if (analyze[i]==tmp) //出现重复
{
int lentmp=0;
for (int m=0;m<MAX_NUM;m++) //获得当前数组的长度
{
if (analyze[m]=='\0')
{
lentmp=m;
break;
}
}
if (len<lentmp) //每次比较,保留最大长度作为非重复子串的最大长度
{
len=lentmp;
}
reset=true; //重复标志为真
printf("\n 重复位置 %d,%d",i,len);
break;
}
if (analyze[i]=='\0')
{
break;
}
}
if(reset==false) //未重复,字符填入数组
analyze[i]=tmp;
if (reset==true) //重复,复制重复位置后的数组,填入当前字符
{
int m;
char analyzeTmp[MAX_NUM]={'\0'};
for (m=0;m<MAX_NUM-i;m++)
{
analyzeTmp[m]=analyze[m+i+1];
if (analyze[m+i+1]=='\0')
{
break;
}
}
analyzeTmp[m]=tmp;
for (m=0;m<MAX_NUM;m++)
{
analyze[m]=analyzeTmp[m];
}
}
}
pos++;
}
int lentmp=0;
for (int m=0;m<MAX_NUM;m++) //与最后一次处理数组比较长度
{
if (analyze[m]=='\0')
{
lentmp=m;
break;
}
}
if (len<lentmp)
{
len=lentmp;
}
printf("\n 最长非重复长度是 %d",len+1); //数组从0开始计数,所以实际长度是len+1
system("PAUSE");
return 0;
}
{
srand((unsigned)time(NULL));
char orgChar[MAX_NUM];
for (int i=0;i<MAX_NUM-1;i++)
{
//产生大写字母、小写字母
int tmpInt=random(65,122);
while ((tmpInt>90)&&(tmpInt<97))
{
tmpInt=random(65,122);
}
orgChar[i]=(char)tmpInt;
}
orgChar[MAX_NUM-1]='\0';
string s;
s=orgChar;
printf("%s\n",orgChar);
cout<<s.c_str()<<endl;
printf(" %d",s.length());
int pos=0;
int len=0;
char analyze[MAX_NUM]={'\0'};
while (pos<s.length())
{
char tmp=s[pos];
if (analyze[0]=='\0') //第一个字符直接填入
{
analyze[0]=tmp;
}
else
{
bool reset=false;
int i;
printf("\n %d %s",pos,analyze);
for (i=0;i<MAX_NUM-1;i++)
{
if (analyze[i]==tmp) //出现重复
{
int lentmp=0;
for (int m=0;m<MAX_NUM;m++) //获得当前数组的长度
{
if (analyze[m]=='\0')
{
lentmp=m;
break;
}
}
if (len<lentmp) //每次比较,保留最大长度作为非重复子串的最大长度
{
len=lentmp;
}
reset=true; //重复标志为真
printf("\n 重复位置 %d,%d",i,len);
break;
}
if (analyze[i]=='\0')
{
break;
}
}
if(reset==false) //未重复,字符填入数组
analyze[i]=tmp;
if (reset==true) //重复,复制重复位置后的数组,填入当前字符
{
int m;
char analyzeTmp[MAX_NUM]={'\0'};
for (m=0;m<MAX_NUM-i;m++)
{
analyzeTmp[m]=analyze[m+i+1];
if (analyze[m+i+1]=='\0')
{
break;
}
}
analyzeTmp[m]=tmp;
for (m=0;m<MAX_NUM;m++)
{
analyze[m]=analyzeTmp[m];
}
}
}
pos++;
}
int lentmp=0;
for (int m=0;m<MAX_NUM;m++) //与最后一次处理数组比较长度
{
if (analyze[m]=='\0')
{
lentmp=m;
break;
}
}
if (len<lentmp)
{
len=lentmp;
}
printf("\n 最长非重复长度是 %d",len+1); //数组从0开始计数,所以实际长度是len+1
system("PAUSE");
return 0;
}