【筆試總結】網易2019校招編程題-玩你媽的橡皮泥
阿新 • • 發佈:2018-09-09
nbsp 三種 順序 bubuko 環形隊列 什麽 復雜度 問題 ++
題目我就不多說什麽了,橡皮泥,一串橡皮泥哦。
非黑即白。
小明可以采取以下方法0或多次:
從某一處切割,讓切割處左右隊列內兩條橡皮泥整個發生反轉,再拼接到一起。
輸入:
橡皮泥隊列
輸出:
最長的黑白相間的橡皮泥長度
樣例輸入:
bwbwb
樣例輸出:
5
分析:
從某一處截斷之後,兩邊同時反轉,相當於如果把每個橡皮泥比作一個球,放在一個環裏,從某一處截斷後,倒置環,球又滾到一起拼接起來,我還特意畫了個圖演示。
不知道讀者看懂了沒,反正我是看懂了,那我們接著往下講。
就圖上這個圓圈來說,我們來推導一個極端的情況,就是圈內所有的球球都填滿了。這時候會發生什麽呢?我覺得玩過這種玩具的熊孩子都應該知道,那就是——
無論你怎麽插,怎麽動,她都不會有一點反應。這就對了。
這是極端情況,代表的是,如果這個bw串首尾相接,那麽就算小明插∞次,整個隊列情況不會有絲毫改變,問題就變成了:
已知一個環形由b或w組成的串,求其中最長的bw相間的子串長。問題簡單了不?
好,可能字符串首尾相接在計算機中不太好表示,其實我數據結構是真的渣,所以我還得繼續簡化:
對一個已知的環形隊列,進行上述的“分割並反轉”操作,能夠包括所有分割可能的線性隊列是什麽樣的?我們再來看圖。
圖上分別列出了三種分割後進行倒轉產生的新隊列。以此類推,所有的分割情況產生的新隊列,無非是上圖右側隊列的【一個子隊列】
而上圖右側這個隊列,剛好是原始隊列的X2!
這樣,原問題便轉換為:
已知一個長為X的隊列,由b或w拼接成。現求相同的兩個X隊列順序拼接後,其中長為X的順序子序列內,能出現的最長bw相間的序列長度。
源代碼:
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 int max(int a,int b) { 7 if (a >= b) return a; 8 else return b; 9 } 10 int main() { 11 string s; 12 cin >> s;13 s += s; 14 int ans = 1; 15 for (int i = 0; i < s.size(); i++) { 16 int j = 1; 17 while (i != s.size() - 1 && s[i] != s[i + 1]) { 18 i++; 19 j++; 20 } 21 ans = max(ans, j); 22 } 23 if (s.size() / 2 < ans) { 24 ans = s.size() / 2; 25 } 26 printf("%d\n", ans); 27 return 0; 28 }
時間復雜度:其中一個主要循環,受制參數為s.size(),所以時間復雜度為o(|S|),|S|為串長。
玩你媽的橡皮泥。
【筆試總結】網易2019校招編程題-玩你媽的橡皮泥