面试题 17.05. 字母与数字

面试题 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);
    }
};
原文地址:https://www.cnblogs.com/Vampire6/p/13210023.html