此乃字符串处理的典型例题,不知到为什么在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; }