1. 程式人生 > 實用技巧 >面試題 17.05. 字母與數字

面試題 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);
    }
};