Q1
??? 給定兩個字符串稳吮,求出它們之間最長的相同子字符串的長度端朵。
??? 暴力求解:
??? 以字符串中的每個字符作為子串的端點宣决,判定以此為開始的子串的相同字符最長能達到的長度穿挨,挨個尋找每一個可能的最大子串,時間復(fù)雜度為?? O(n3)捆毫;
??? 動態(tài)規(guī)劃法:
??? 暴力解法是從字符串開端開始找尋闪湾,現(xiàn)在換個思維考慮以字符結(jié)尾的子串來利用動態(tài)規(guī)劃法冲甘。假設(shè)兩個字符串分別為s和t绩卤,s[i]和t[j]分別表示其第i和第j個字符(字符順序從0開始),再令L[i, j]表示以s[i]和s[j]為結(jié)尾的相同子串的最大長度江醇。應(yīng)該不難遞推出L[i, j]和L[i+1,j+1]之間的關(guān)系濒憋,因為兩者其實只差s[i+1]和t[j+1]這一對字符。若s[i+1]和t[j+1]不同陶夜,那么L[i+1, j+1]自然應(yīng)該是0凛驮,因為任何以它們?yōu)榻Y(jié)尾的子串都不可能完全相同;而如果s[i+1]和t[j+1]相同条辟,那么就只要在以s[i]和t[j]結(jié)尾的最長相同子串之后分別添上這兩個字符即可黔夭,這樣就可以讓長度增加一位。合并上述兩種情況羽嫡,也就得到L[i+1,j+1]=(s[i]==t[j]?L[i,j]+1:0)這樣的關(guān)系本姥。最后就是注意臨界值的問題,當i和j等于0時杭棵,優(yōu)先處理好再進行動態(tài)規(guī)劃婚惫。時間復(fù)雜度為O(n2)。
Q2
??? 64位機上魂爪,一個結(jié)構(gòu)體有三個成員先舷,分別是char,int滓侍,short類型蒋川,三個成員位于結(jié)構(gòu)體中不同位置時整個結(jié)構(gòu)體的大小可能是哪些值?
??? 答案:8撩笆、12
??? 內(nèi)存對齊規(guī)則:
??? 1捺球、?對于結(jié)構(gòu)的各個成員,第一個成員位于偏移為0的位置浇衬,以后每個數(shù)據(jù)成員的偏移量必須是min(#pragma pack()指定的數(shù)懒构,這個數(shù)據(jù)成員的自身長度) 的倍數(shù)。例如char耘擂,int胆剧,short;char首先存儲在偏移量為0的位置,再來存儲int秩霍,int占四個字節(jié)篙悯,則其存儲位置偏移量必須為4的倍數(shù),于是存儲在偏移量為4的位置铃绒,short存儲在偏移量為8的位置鸽照。
??? 2、?在數(shù)據(jù)成員完成各自對齊之后颠悬,結(jié)構(gòu)(或聯(lián)合)本身也要進行對齊矮燎,對齊將按照#pragma pack指定的數(shù)值和結(jié)構(gòu)(或聯(lián)合)最大數(shù)據(jù)成員長度中,比較小的那個進行赔癌。
??? #pragma pack(n) 表示設(shè)置為n字節(jié)對齊诞外。 VC6默認8字節(jié)對齊。