一次面试失败的反思

//目的描述: 为了查找指定字符串中最长的重复字符串(允许字符重复),并求出最多个数
//算法描述:需要的是重复字符串,重复字符串的长度最大可能是全字符串长度减去1,这样我们从
//可能最大的开始,依次减少,到字符串里面找出所有长度为指定最大的重复字符串并计数.
//在遍历字符串的过程中,我们把字符串分成两个部分遍历,一个是从0 到当前位置,一个是从
//当前位置加1到字符串末尾,只要找到,这些就肯定是最长的
int MaxLengthRepeatString(const char *src)
{
 assert(src);
 int length = strlen(src);
 int len = length - 1 ;
 int count = 0;
 char * target = 0;
 for(;len > 0;len--)
 {
  //向前推进,遍历全字符串
  for(int i = 0;i + len <= length;++i)
  {
   //在当前位置的前面一串字符串(包括当前字符)中遍历
   int k = 0;
   for(k = 0;k + len <= i;k++)
   {
    int j = 0;
    bool find = true;
    //和前面字符串对比从当前字符串起,长度为最长的所有连续可能字符
    for(j = 0;j < len ;++j)
    {
     if(src[i + j] != src[k + j])
     {
      find = false;
      break;
     }
    }

    if(find)
    {
     //找到一个,输出并计数
     if(target == 0)
     {
      target = new char[len + 1];
      strncpy(target,src + i,len);
      target[len] = '/0';
      printf("forward target is :%s,position is :%d,next position is: %d/n",target,i,k);
      delete []target;
      target = 0;
     }     
     count++;
    }    
   }

   //在当前位置的后面一串字符串(不包括当前字符)中遍历
   for(k = i + 1;k + len <= length;k++)
   {
    int j = 0;
    bool find = true;
    //和后面字符串对比从当前字符串起,长度为最长的所有连续可能字符
    for(j = 0;j < len;++j)
    {
     if(src[i + j] != src[k + j])
     {
      find = false;
      break;
     }     
    }

    if(find)
    {
     //找到一个,输出并计数
     if(target == 0)
     {
      target = new char[len + 1];
      strncpy(target,src + i,len);
      target[len] = '/0';
      printf("follow target is :%s,position is :%d,next position is: %d/n",target,i,k);
      delete []target;
      target = 0;
     }
     count++;
    }
   }

   //找到,退出全遍历
   if(count > 0)
   {
    break;
   }
  }

  //找到,退出最长遍历
  if(count > 0)
  {
   //printf("repeat string is : %s, length is :%d/n",strncpy(),len);
   printf("repeat string length is :%d/n",len);
   break;
  }
 }

 return count;
}

//谨以此帖纪念2007 年4 月份面试该题目失败,反思算法,算法描述和算法实现之间的关系.
//并参考此帖 http://community.csdn.net/Expert/topic/5453/5453623.xml?temp=.2721674
//感触很深,基本的能力和思路真的很重要,当我们写下每条指令的时候,我们一定要深刻的
//知道他要作什么,万幸的是,可能我们现在提供了太多的库,但是,我们的基本能力却越来越低了。

int main(int argc, char* argv[])
{
 //bcdghh
 //char * source = "aaaapbaaaabcaaaaaanaaaaaAaaaaa";
 //char * source = "bcdghddbcdghgfdsAbcdgBAABbcdghFFbcdghhutruytbcdgh";
 char * source = "AAAAAAAAAAAAAAAA";
 //int jjj = MaxLengthRepeatString(source);
 int jjj = MaxLengthRepeatString(source);
 printf("%s/n",source);
 printf("repeat count is :%d/n",jjj);
}

 

//更简单的方式是:

假定字符串长度是N,重复字符串的长度最大可能是N/2,这样我们可以转换问题为在

N/2 到N-1 的字符串里面查找 M/2(0<M<=N/2)到1 的重复字符串.算法分析太重要了.

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值