百度20140925面試算法題一道
來源:程序員人生 發布時間:2014-10-16 16:19:15 閱讀次數:3229次
題目:一個char數組只包含a,b,c,d,e五種字符,設計一種算法,找出一個包含五種字符的最小區間【a,b】,數組是循環的
O(n)算法:
/*
*一個char數組只包含a,b,c,d,e五種字符,
*設計一種算法,找出一個包含五種字符的最小區間【a,b】
*數組是循環的
*/
#include<iostream>
using namespace std;
void find(char array[], int size)
{
int count[5];
for(int i = 5; i <= size; i++)//區間寬度從5開始,遍歷數組中所有區間
{
for(int index = 0; index < 5; index++)
count[index] = 0;//將a,b,c,d,e的個數都初始化為0
//下面遍歷數組,對于前i個數,將對應的字符數加1
//每遍歷后面一個數,相當于把區間往后移一位,所以需要將前面區間的第一位字符從count數組中去除(減1)
//對于每個區間,將count數組的數相乘就能判斷是否包含了五種字符
for(int begin = 0; begin < size + i - 1; begin++)
{
int tmp_begin = begin;
if(begin < i)
count[array[begin] - 'a']++;
else
{
count[array[begin - i] - 'a']--;
if(begin >= size)
tmp_begin = begin - size;
count[array[tmp_begin] - 'a']++;
}
if(begin >= i - 1 && count[0] * count[1] * count[2] * count[3] * count[4] != 0)//a,b,c,d,e個數相乘,判斷是否至少有一個為0
{
cout << '[' << begin - i + 1 << ',' << tmp_begin << ']' << endl;
return;
}
}
}
}
已知有O(n)算法,另外想。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈