现在的位置: 首页 > 综合 > 正文

一个百度面试题“找珠子”的实现算法

2013年10月03日 ⁄ 综合 ⁄ 共 1475字 ⁄ 字号 评论关闭

题目:一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。

 

思路就是下面的:
两个指针,一个指针走,记录走过多少个颜色,如果n个颜色都有了,就走第二个指针。每次第一个指针停止的时候就记录长度。等到第一个指针走过m了话,就扫描一遍了。复杂度O(m)
之前有个在一串字符中只有abcd,找出全包含的最短sub字符串,一个想法

 

//定义珠子
struct TYPE
{
    string color;
};
TYPE zhuzi[];

#define T TYPE

struct Result
{
 T *pstart;    //存放开始的位置
 T *pend;      //存放结束的位置
 int m_Length;  //存放字符串长度
};

Result Temp;     //暂存找到的字符串
Result MinResult;   //长度最小的字符串

void InitStruct(Result a)
{
a.m_Length=0;
a.pend=a.pstart=NULL;
}
//初始化两个结构体
InitStruct(Temp);
InitStruct(MinResult);
MinResult.m_Length=10000000;    //它的长度可以先定义一个足够大的数据,便于进行比较

//珠子的信息采用T类型的数组来存储,其内容是存放的每一个珠子的颜色
void SearchFunc(T zhuzi[])
{
  T *p1,*p2;
  p1=p2=NULL;
  bool red_appear,black_appear,yellow_appear;
  red_appear=black_appear=yellow_appear=false;
  int i;
  int nCount=0;   //记录目标颜色珠子出现的次数

  for (i=0,p1=zuzi;i<zuzi.length();p2=p1,p1++,i++)
  {
      if (*p2=="red"&&red_appear==false)
      {
          nCount+=1;
          red_appear==true;
      }
      else if(red_appear==true)
      {
          break;   //去执行下一次循环
      }
      if (*p2=="black"&&black_appear==false)
      {
          nCount+=1;
          black_appear=true;
      }
      else if(black_appear==true)
      {
          break;
      }
      if (*p2=="yellow"&&yellow_appear==false)
      {
          nCount+=1;
          yellow_appear=true;
      }
      else if(yellow_appear==true)
      {
          break;
      }

      //判断是否已经找到所有的目标颜色的珠子
      if (nCount==3)
      {
          Temp.pstart=p1;
          Temp.pend=p2;
          Temp.m_Length=p2-p1;
          if (Temp.m_Length<MinResult.m_Length)
          {
              MinResult=Temp;
          }
      }
  }
}

 

抱歉!评论已关闭.