朋友们昨天人人的笔试最长子串那道题有人做吗?

是这样的,我昨天做那道题,我的思路是这样的:首先设置两个长度为26的数组,初值为0,一个数组存最大值,另一个存我走过的部分每个字母的个数。然后设置一个i和j都指向第一个字母,j先往后走,一旦发现我走过的部分不满足条件,i往前移动,存走过部分的把i之前位置对应字母个数减1,直到满足条件为止,然后j继续往后走,直到j走到字符串结尾为止。但是这样我的通过率并不高,我想知道到底是我代码写的有问题还是我这个思路就不对呢?按理说子串不是子序列,不会有不连续的问题啊,下面是我的代码,谢谢大家:
#include <iostream>
#include <cstdio>
#include <vector>
#include<string>
#include <deque>
#include<stdlib.h>
#include <iterator>
#include <algorithm>
#include<math.h>
#include <string>
using namespace std;

int main()
{
string a;
int*lenzc = new int[26];
while (cin >> a)
{
vector<int> dqlen(26, 0);
int i,j;
for ( i = 0; i < 26; i++)
{
cin >> lenzc[i];
}
i = 0,j=0;
int maxlength = 0;
while (j < a.size() && i < a.size())
{
dqlen[a[j] - 'a']++;
if (dqlen[a[j] - 'a']>lenzc[a[j] - 'a'])
{
if (maxlength < j - i)
maxlength = j - i;

dqlen[a[i] - 'a']--;
i++;
int flag = 1;
while (flag&&i<=j)
{
int cdflag = 0;
for (int k = 0; k < 26; k++)
{
if (dqlen[k]>lenzc[k])
{
dqlen[a[i] - 'a']--;
cdflag++;
}
if (cdflag == 26)
flag = 0;
}
i++;
}

}
j++;
}
if (maxlength < j - i)
maxlength = j - i;
cout << maxlength << endl;
}
delete[] lenzc;
return 0;
}

#人人网#
全部评论
没问题,我就是这样写的
点赞 回复 分享
发布于 2017-09-14 12:59

相关推荐

有趣的牛油果开挂了:最近这个阶段收到些杂七杂八的短信是真的烦
点赞 评论 收藏
分享
面试摇了我吧:啊哈哈面试提前五个小时发,点击不能参加就是放弃
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务