求两个字符串的最大公共字串

//今天面试遇到一个有趣的题目 取两个字符串的最大公共字符串
//解决方案如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//先造一个常用函数
char* strsub( char const* pStrSrc, int iStart, int iLen )
{
	if( !pStrSrc || iStart <  0 )
		return NULL;

	int iStrLen = strlen( pStrSrc );

	char* pStrRes = NULL;
	if( iLen >= iStrLen - iStart )
	{
		pStrRes = (char*)malloc( iStrLen - iStart + 1 );

		if( !pStrRes )
			return NULL;

		memset( pStrRes, 0,  iStrLen - iStart + 1 );

		strncpy( pStrRes, pStrSrc + iStart, iStrLen  - iStart );

		return pStrRes;
	}
	else
	{
		pStrRes = (char*)malloc( iLen + 1 );
		
		if( !pStrRes )
			return NULL;

		memset( pStrRes, 0, iLen + 1 );

		strncpy( pStrRes, pStrSrc + iStart, iLen );

		return pStrRes;

	}

}

char* maxComm( char* pStrLeft, char* pStrRight )
{
	if( !pStrLeft || !pStrRight )
	{
		return NULL;
	}

	char* pStrLess = NULL;
	char* pStrMore = NULL;
	char* pStrRes= NULL;

	int iLeft = strlen( pStrLeft );
	int iRight = strlen( pStrRight );

	int iLess = ( iLeft <= iRight ) ? iLeft : iRight;

	int i,j;
	
	if( iLeft <= iRight )
	{
		pStrLess = pStrLeft;
		pStrMore = pStrRight;
	}
	else
	{
		pStrLess = pStrRight;
		pStrMore = pStrLeft;
	}
	char* pSt = NULL;

	for( i = iLess; i > 0; i-- )
	{
		for( j = 0; j <= iLess - i; j++ )
		{
			pStrRes = strsub( pStrLess, j, i );

			if( strstr( pStrMore, pStrRes ) )
				return pStrRes;

			free( pStrRes );
			pStrRes = NULL;
		}
	}

	return NULL;
}

int main( int argc, char** argv )
{
	char* pStrLeft = "adasdfabc";
	char* pStrRight = "asdabcasdf";

	puts( "max comm string between two strings" );
	char* strMaxComm = maxComm( pStrLeft, pStrRight );
	printf( strMaxComm );
	puts( "" );

	free( strMaxComm );
	strMaxComm = NULL;

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值