LCS演算法 微軟面試題Review

2021-04-17 11:45:41 字數 1393 閱讀 7533

當年微軟面試時要求我寫乙個返回兩個任意字串中最大公共串的函式,即abcdef 和 qcfbcc 返回值為bc語言不限

我的思路:

1.確定乙個串為長串,另乙個串為短串,在長串中找短串(長串中最長的公串可能性就是短串本身)

2.順序確定短串中的每個字元是否在長串中出現(先做乙個預定位)

3.如滿足條件2,即短串中某個字元在長串中出現,在長串中試圖找從這個字元起到短串末尾止的整個串

4.如果不滿足條件3,短串末尾遞減1個字元,直到找到此次字元出現的最大長度(至少是乙個字元)

5.把此次找到的字元長度,與臨時變數比較,如果此次長度大於歷史長度,重賦值返回值

6.重複2-5,直到短串末尾

我的實現:

c#版public static string getpubmaxstring(string value1,string value2)

for (int i=0;i-1)//長串中依次判斷短串的每個字元是否出現}}

}return result;

}此演算法的缺點是需要用很多次substring方法,而此方式是需要建立新的string物件的,所以系統資源消耗比較大

後來在csdn上看到了soholi(天涯孤棹) 網友實現上更簡潔的演算法:

public static string getlargepublicstring(string a,string b)}}

return string.empty;

}真是可以算是很優雅簡潔的實現,兩個實現主要區別就在於,我那個getpubmaxstring是先定位確實存在的乙個字元後,才開始找這個一定存 在,但長度未知的公共串,而網友soholi(天涯孤棹) 的getlargepublicstring則是在長串遍歷整個短串的組合。

最近和薛 強兄吃飯聊起來,他給出了lcs(longest common subsequence)演算法的正解。其實早有牛人針對這一問題給出了標準演算法了,一試之下,確實還是效能最好的方式。完全不需要用.net string物件所消耗的開銷,而是語言無關的傳統陣列比較的方式,在其他語言也有借鑑意義,看來這也是傳統的c、c++具有頑強生命力的原因所在之一 吧,演算法的魅力與力量確實還是博大精深啊!

演算法如下:

public static string compare(string str1, string str2)

int sign = new int[str1.length];

int length = 0;

int end = 0;

for (int i = 0; i < str2.length; i++)

else

sign[j] = 0;

if (sign[j] > length)}}

return str1.substring(end - length + 1, length);

}

微軟面試題

題目 小明和小強都是張老師的學生,張老師的生日是m月n日,2人都知道張老師的生日是下列10組中的一天,張老師把m值告訴了小明,把n值告訴了小強,張老師問他們知道他的生日是那一天嗎?3月4日 3月5日 3月8日 6月4日 6月7日 9月1日 9月5日 12月1日 12月2日 12月8日 小明說 如果我...

微軟面試題

fly.c4 推薦您必看!六.演算法題 說明 這些題就不是什麼花樣了,考的是你的基礎知識怎麼樣。再聰明而沒有實學的人都將會被這些題所淘汰。1.鍊錶和陣列的區別在 2.編寫實現鍊錶排序的一種演算法。說明為什麼你會選擇用這樣的方法?3.編寫實現陣列排序的一種演算法。說明為什麼你會選擇用這樣的方法?4.請...

微軟面試題

1.燒一根不均勻的繩,從頭燒到尾總共需要1個小時。現在有若干條材質相同的繩子,問如何用燒繩的方法來計時乙個小時十五分鐘呢?答 點燃繩子a的兩端,和繩子b的 一端,當a燒完時,b餘下的可以燒半個小時 這時把b的另一端點燃,並開始計時,等b燒完時可確定15分鐘,然後再點燃繩子c 兩端 燒完總時間為1小時...