一 找出两个字符串中最大的公共字串
#include "stdio.h"
#include "malloc.h"
#include "string.h"
char *maxsubstr(char *str1, char *str2)
{
char *p1, *p2, *q1, *q2, *destp;
char *substr;
int max = 0, len;
p1 = str1;
while(*p1 != '\0')
{
q1 = str2;
while(*q1 != '\0')
{
len = 0; //这部分初始化非常重要,要注意好!
p2 = p1;
q2 = q1;
while((*p2 != '\0')&&(*q2 != '\0'))
{
if(*p2 == *q2)
{
p2 ++;q2 ++;len ++;
}
else
{
break;
}
}
if(len > max)
{
max = len;
destp =p1;
}
q1++;
}
p1++;
}
substr=(char*)malloc(sizeof(char)*max);
strncpy(substr,destp,max);
substr[max] = '\0';
return substr;
}
int main()
{
char *s1="aocdfe";
char *s2="pmcdfa";
char *sub;
printf("%s\n%s\n",s1,s2);
sub = maxsubstr(s1,s2);
printf("the max sub string is:%s\n",sub);
return 0;
}
多个字符串最大的公共子字符串
#include <iostream>
#include <string>
using namespace std;
//将第一个字符串与最短的字符串交换
void swap(string *pStr,int i)
{
string temp;
temp = *pStr;
*pStr = *(pStr + i);
*(pStr + i) = temp;
}
char* findSameSubStr(char**asd, int N)
{
int i,j,k,len,min,maxLen = 0,minLen = 256;
string maxStr,tmpStr,*pStr = new string [N];
//找出输入的字符串中长度最小的串,并把最小串序号记在min中
for(i = 0; i < N; ++ i)
{
*(pStr + i) = asd[ i ];
// *操作符与调用函数的.操作符优先级问题,.优先级高于*,所以必须加上()
len = (*(pStr +i)).length();
//find the minimal length of the string
if( len < minLen)
{
minLen = len;
min = i;
}
}
//swap the string and put the minimal string in the first
//printf("the minimal length string = %d\n",min);
swap(pStr,min);
len = pStr[0].length();
for(i = 0; i < len && maxLen <= len - i - 1; ++ i)
{
for(j = 0; j < len && maxLen <= len - i - j - 1; ++ j)
{
//对字符串数组中第一个子串,求出其可能的子串值,如果剩余子串长度小于maxLen则不用去求了,for循环中给出了限制
tmpStr = pStr[0].substr(i, len - j);
//将子串tmpStr与参与匹配的字符串比较,判断tmpStr是否为剩余串的子串,如果不是则break出循环
for(k = 1; k < N; ++ k)
{
string::size_type pos = pStr[k].find(tmpStr);
if(pos < pStr[ k ].length())
continue;
else
break;
}
if(k == N)//说明子串tmpStr是其他参与匹配的子串的子串
{
if(tmpStr.length() > maxLen)//tmpStr如果是当前最大的子串,则记录下来
{
maxLen = tmpStr.length();
maxStr = tmpStr;
}
}
}
}
char * maxstr = new char [maxStr.length() + sizeof(char)];
strcpy(maxstr,maxStr.c_str());
delete []pStr;
return maxstr;
}
int main()
{
int N = 3;
/*
string *pStr;
pStr = new string [N];
pStr[0] = "main what is local bus";
pStr[1] = "main this is local bus";
//pStr[2] = "local bus is name sdhfj";
pStr[2] = "main";
*/
//char *asd[ 3 ] = {"main what is local bus","main this is local bus","main my name is tian mo thank you very much"};
char *asd[ 3 ] = {"mainttianmomomo","hthhttmainttgggsdjfsjdfsdf","fsadfasdfsamainttoewrowjfjsjfldsmflasjdfljslfls"};
printf("最大公共子串为:%s\n",findSameSubStr(asd, N));
return 0;
}
二 找出字符串中最大的整数
int _FindMaxData(const char *str)
{
if(NULL == str)
return 0;
int temp, flag, max = 0;
const char *p = str;
while ('\0' != *p)
{
temp = 0;
flag = 0;//设置是否有整数的标志
while (*p >= '0' && *p <= '9')
{
temp = 10 * temp + *p - '0';
++ p;
flag = 1;
}
if (flag)
{
if(max < temp)
{
max = temp;
}
-- p;//由于在存整数的时候多走了一步,要减1
}
++ p;
}
return max;
}
void main()
{
char str[] = "A5C6B9572DDEF6912YY9573GG12345II001234";
printf("max = %d\n",_FindMaxData(str));
}
三 找出字符串中最大的由0-9组成的串
int _FindMaxData(const char *str)
{
if(NULL == str)
return 0;
int temp, flag, max = 0;
const char *p = str;
while ('\0' != *p)
{
temp = 0;
flag = 0;//设置是否有整数的标志
while (*p >= '0' && *p <= '9')
{
//temp = 10 * temp + *p - '0';
temp ++;
++ p;
flag = 1;
}
if (flag)
{
if(max < temp)
{
max = temp;
}
-- p;//由于在存整数的时候多走了一步,要减1
}
++ p;
}
return max;
}
void main()
{
char str[] = "A5C6B9572DDEF6912YY9573GG12345II001234";
printf("max = %d\n",_FindMaxData(str));
}
四
待续 。。。