7-22
今天在公司试着加强自己的解决问题的思维,也让自己周末不无聊,写了leetcode的76题,简单思考后,开始边写边测试。经过几次的逻辑错误后,最后倒在超出时间限制这个坑上面(主串10万个字符,难顶),尝试增加一些限制条件后,发现依旧不行,重新审视了自己写出的代码,应该是本身使用的解决方式本不行。于是就打住为止,毕竟脑子不得行,再慢慢锻炼吧0.o
执行结果来看,大多数都通过了。但解决方法太笨了,所以不行吧。。
char * minWindow(char * s, char * t){
//主串搜寻子串的指针
unsigned int left, right, i;
//int record[24] = {0}; //记录起始点(下标)和长度(值)
char sonRe[128] = { 0 };
char sonReTemp[128] = { 0 };
int sonCnt = 0;
char* retStr = NULL;
int minRe = 9999;
int minNo = 0;
/*
每轮 right 从left处移动并判断是否为字串中的字母,移动到最后,若没有则停止
*/
int tlen = strlen(t);
int slen = strlen(s);
left = 0; right = 0; i = 0;
for (i = 0; i < tlen; i++)
{
sonReTemp[t[i]]++;
}
while ((left <= slen - 1) || (slen - left > tlen))
{
if (sonReTemp[s[left]] == 0)
{
left++;
continue;
}
for (right = left; right < slen; right++)
{
if (sonReTemp[s[right]] == 0)
{
continue;
}
for (i = 0; i < tlen; i++)
{
if ((s[right] == t[i]) && (sonRe[s[right]] < sonReTemp[s[right]]))
{
sonRe[t[i]]++;
sonCnt++;
break;
}
}
if (sonCnt == tlen)
{
break;
}
}
if (sonCnt < tlen)
{
break;
}
if (sonCnt == tlen)
{
//record[left] = (right - left);
if ((right - left < minRe) && (right - left + 1 >= tlen))
{
minRe = right - left + 1;
minNo = left;
}
sonCnt = 0;
}
left++;
memset(sonRe,0,sizeof(sonRe));
}
if (minRe != 9999)
{
retStr = (char*)malloc((minRe + 1) * sizeof(char));
//for (i = 0; i < minRe; i++)
//{
// retStr[i] = s[i + minNo];
//}
memcpy(retStr,s + minNo, minRe);
retStr[minRe] = '\0';
}
else
{
retStr = "";
}
return retStr;
}
写出的算法,很简单粗暴,就不显眼聊思考。如果有有缘人看了,有一些怎么做算法能力提升的方式,就在此求教了。。