面試題 17.05. 字母與數字
阿新 • • 發佈:2020-06-29
- 令字母為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); } };