面试题 17.05. 字母与数字
- 令字母为1,数字为-1,先求前缀和,如果前缀和数组该位置为0,那么说明区间[0,i]之间和为零,我们需要最长的连续的子区间的和为0,那么我们先定义结果的这个区间的头为x,尾巴为y,当遍历前后缀和数组时,位置为0的地方,更新x,y的值为0,i,当遇到其他前缀和时,当map<int,int>mp里有没有这个,若没有,则存入map,用来记录除了前缀和第一次为0的其他前缀和的位置,如果发现非零的前缀和mp里有了,那么就判断哪个区间长即可,即判断 $ i-mp[sum[i]] $ 和 $ y-x+1 $ 的大小,若比之前的大,则更新x,y的值即可,最后返回array数组的x,y+1这段区间的值即可。
class Solution {
public:
vector<string> findLongestSubarray(vector<string>& array) {
map<int,int>mp;
int sum[array.size()+10];
int k[array.size()+10];
for(int i=0;i<array.size();i++)
{
if((array[i]>="a"&&array[i]<="z")||(array[i]>="A"&&array[i]<="Z"))
k[i]=1;
else
k[i]=-1;
}
sum[0]=k[0];
for(int i=1;i<array.size();i++)
{
sum[i]=sum[i-1]+k[i];
}
int x=0,y=0;
for(int i=0;i<array.size();i++)
{
if(sum[i]==0)
{
x=0;y=i;
}
else if(!mp.count(sum[i]))
{
mp[sum[i]]=i;
}
else if(i-mp[sum[i]]>y-x+1)
{
x=mp[sum[i]]+1;
y=i;
}
}
if(x==y)
return {};
return vector<string>(array.begin()+x,array.begin()+y+1);
}
};