輸出兩字串最大相同部分 C面試題

2021-06-21 23:26:06 字數 2337 閱讀 5954

面試題,是紙上寫的,發現了些錯誤,回來改進了下。寫紙上和寫計算機裡並編譯成功完全是兩個效果。

開始沒太多字串操作,很繁瑣、難點也多,後逐漸改進

典型問題1:

sizeof()侷限於棧陣列

char a = "asd213123123";

形式,並且這種不能用'\0'判斷是否結束(這種判斷方式能很方便加在while條件中用於判斷越界——b != '\0')。

如果是字串常量:

char *b = "dasa****sdf";

這種情況,sizeof()就廢掉了!

總之:

對號入座,前者sizeof、後者strlen~!不過sizeof(a)和strlen(b)還有另外乙個區別,strlen不計算'\0',而sizeof要計算(前提是sizeof()不針對char指標)

典型問題2:

用什麼來暫存並輸出結果?還是只是記錄下來相關位置——這是我底下未完成版本1想到的思路——用乙個count[sizeof(a)]陣列記錄下a每個位置作為起點所能和b達到的最大重合,最後判斷查詢陣列中最大值,此時目標子字串的起點下標(i)和 i 對應的長度(counter[i])都有了。

這是針對不知道字串大小並且不占用額外空間的做法,需要非常繁瑣的操作,要加很多標記,越界判斷也會有些麻煩(結合優勢麼,用字串常量而不是棧空間中的字元陣列,有'\0'——就好判斷了!)

(關於空間的占用,如果要用乙個和字串a一樣長的陣列counter來計錄a中各起點對應與b最大重合子字串,這個陣列也要和a一樣長,空間上也不合適,除非情形很特殊,a短b長,不然不如直接malloc()乙個堆空間來儲存當前最長「子字串」,並實時更新)

先放乙個改完編譯測試成功的。

release1

//題目:要求比較a字串(例如「abcdef"),b字串(例如(bdcda)。找出重合度最大的子字串,輸出(根據oj經驗,輸》出結果對即可)

#include#include#includemain()

if(count > maxseg)

count = 0;

c = 0;}}

printf("%s\n",final);

free(final);

}

這是能將就用的第乙個版本~!關於結束符'\0'能否影響free()的使用,覺得是完全不用操心的,因為malloc的大小是系統來儲存的,刪除時候系統來接手就完了,而'\0'結束符只是針對一些常規字串操作,比如printf()用%s控制輸出時~!

新難點:找到的子字串同時一樣長怎麼辦?那我這只能叫做」第乙個最長的重合字串「用兩塊空間來儲存?三段等長怎麼辦?

如:"abclbcdlcdel"

"kabckbcdkcde"

abc長3,bcd長3,cde長3。。。

未完成版本1:這段是錯誤示範,初期定位模糊思路亂,有些函式和功能不把握,又在紙上寫。

思路亂的乙個後果就是前期想用i和j簡單判斷越界問題,後期又弄了i+c之類的下標,

修改思路:

把字串換成「字串常量」——帶'\0'的,這樣在小while中用 != '\0'就能判斷出界問題。

把字串變成字串常量以後的另乙個問題是sizeof不能用了,引入string.h,用strlen()替代即可。

//題目:要求比較a字串(例如「abcdef"),b字串(例如(bdcda)。找出重合度最大的子字串,輸出(根據oj經驗,輸出結果對即可)

//遺忘,未使用string.h相關函式。

#includemain()

//清零,準備面對新的起點j~!以j為起點再找匹配的一段字串

//j不用恢復~!恢復原樣的話,算上j++是移動了一位,不會死迴圈~!但是,因為這一段本來就是連續的,abcd都連續了,bcd和cd不用看了。

temp = 0;

c = 0;

} }//比較count陣列,看哪個i對應子段越大

//temp = 0;//節省空間的考慮(雖然只有4b),怕不適應就改叫max,去宣告乙個max變數。

for(i = 0;i < sizeof(a);i++)

if(count[i] > max)

//輸出該子段

for(i = flag;i < flag + count[flag];i++)

printf("\n");

}

快速比較兩字串最大相同演算法

昨天在論壇看到有人提出怎麼識別兩個字串最大的相同的部分,很遺憾沒人回帖,在此發布乙個原創的演算法,可以快速的找出兩個字串中所有的最長的相同的部分。public class bestlike public listgetstring 查詢最大相同長度 while strformat.indexof s...

字串練習 求兩個字串中最大相同的子串

題目 求兩個字串中最大的子串 思路 1 既然取得是最大子串,先看短的那個字串是否在那 長的字串中,如果存在,短的那個字串就是最大子串。2 如果不是呢,那麼就將短的那個子串進行長度 遞減的方式去子串,去長串中判斷是否存在。如果存在就已找到,就不用再找了。解題 import org.junit.test...

兩個字串中最大相同的子串

3,兩個字串中最大相同的子串。qwerabcdtyuiop xcabcdvbn 思路 1,既然取得是最大子串,先看短的那個字串是否在長的那個字串中。如果存在,短的那個字串就是最大子串。2,如果不是呢,那麼就將短的那個子串進行長度遞減的方式去子串,去長串中判斷是否存在。如果存在就已找到,就不用在找了。...