此乃字符串处理的典型例题,不知到为什么在Ubuntu下提示没有strrev函数,可能是编译器的问题吧。
代码如下:
/*
*
*Declaration:The author of <<Accelerated C++>> has wrote in the end of that book: As you look for reading materimal, keep in mind that books on the shelf do not make you a better programmer. Ultimately, the only way to improve your programming is to write programs. >这些程序来自一些ACM书籍,作者只为提高编程能力,实现书中例题或练习。如有侵权,请联系作者,作者将立即删除。
*
*联系邮箱:mingxinglai#gmail.com
*
*/
/*
熟练掌握下列几个字符串处理函数,确保程序代码简洁,高效
strlen: 计算字符串的长度
strncpy:复制字符串的字串
strcpy:复制字符串
strstr:在字符串中寻找子串
strrev:对字符串进行反顺序
*/
#include <stdio.h>
#include <string.h>
int t, n;
char str[100][101];
char * strrev( char *p)
{
int strLen = strlen(p);
int i = 0;
char temp;
for( i = 0; i < strLen / 2; i++)
{
temp = p[i];
p[i] = p[ strLen - i -1];
p[strLen - i - 1] = temp;
}
return p;
}
int searchMaxSubString( char* source)
{
int subStrLen = strlen(source), sourceStrLen = strlen(source);
int i, j;
bool foundMaxSubStr;
char subStr[101], revSubStr[101];
while( subStrLen > 0 )
{
for( i = 0; i <= sourceStrLen - subStrLen; i++)
{
strncpy( subStr, source + i, subStrLen);
strncpy( revSubStr, source + i, subStrLen);
subStr[subStrLen] = revSubStr[subStrLen] = '\0';
strrev( revSubStr);
foundMaxSubStr = true;
for( j = 0; j < n; j++)
if( strstr(str[j], subStr) == NULL && strstr( str[j], revSubStr) == NULL)
{
foundMaxSubStr = false;
break;
}
if( foundMaxSubStr) return (subStrLen);
}
subStrLen--;
}
return 0;
}
int main(int argc, char* argv[])
{
int i, minStrLen, subStrLen;
char minStr[101];
scanf("%d", &t);
while( t--)
{
scanf("%d", &n);
minStrLen = 100;
for( i = 0; i < n; i++)
{
scanf("%s", str[i]);
if( strlen(str[i]) < minStrLen)
{
strcpy( minStr, str[i]);
minStrLen = strlen( str[i] );
}
}
subStrLen = searchMaxSubString( minStr );
printf("%d\n", subStrLen);
}
return 0;
}