學校演算法作業(五) 子串及逆序子串

2022-06-13 02:33:08 字數 3990 閱讀 7900

又到了寫演算法作業的時間了,這週給的題還是有水準的。(可能是因為我沒用函式的關係,寫了好久)話不多說,上題。

其實就是輸出集合的所有子集,加上逆序

讓我們冷靜的思考一下,這道題想要我們幹什麼,首先是要逆序,再就是找子串。好,逆序不是什麼難事,那麼我們來思考一下找有序子串。找有序子串,我們一般會一類一類找。打個比方

栗子:字串:abcde

1、先找最長的abcde

2、找第二長的abcd   bcde

……5、找最短的   a  b c d e

以此類推。

字串尋找思路有了,那麼想想怎麼輸出子串把。很顯然,我們有i類,每一類有j個字串,每個子串長度為k;一看就有三個迴圈。那怎麼控制控制變數呢?對於這種問題列個**是最好的解決方案.

下面->指向的方向

次數\ 迴圈變數

i

j(範圍)

k (範圍)

1

0

0->1

[0,3]abcd

2

1

0->2

[0,2]abc

[1,3]bcd

3

2

0->3

[0.1]ab

[1,2]bc

[2,3]cd

4

3

0->4

[0,0]a

[1,1]b

[2,2]c

[3,3]d

第一遍掃瞄過去 我們會發現 j 的最大值等於 i+1,我們可以很快捷的寫出相應的語句。

for (int i = 0; i < len; i++)

}

現在我麼們只剩下第三個迴圈了。讓我們再來看看**,很容易的我們又發現k的每一次迴圈範圍都是上下限同時後移1位。這也意味著,我們k的初始值和迴圈終止條件,再每次開啟新一輪迴圈時都會改變,而且步長為 1。我們再仔細化一下**

次數\ 迴圈變數

i

j

j與k的關係

k

1

0

0->1

j = 0, k [0,3]

[0,3]abcd

2

1

0->2

j = 0, k[0,2]

j = 1, k[1,3]

[0,2]abc

[1,3]bcd

3

2

0->3

j = 0, k[0,1]

j = 1, k[1,2]

j = 2, k[2,3]

[0.1]ab

[1,2]bc

[2,3]cd

4

3

0->4

j = 0, k[0,0]j = 1, k[1,1]

j = 2, k[2,2]

j = 3, k[3,3]

[0,0]a

[1,1]b

[2,2]c

[3,3]d

這樣我就清晰的發現 j 和 k 的 值是同步的。好了,現在只剩下 k 的結條件了。咋一眼看過去沒什麼規律是吧。讓我們仔細觀察一下 k 的值,是不是每一組的第一次終止條件都不一樣。

從 3 -> 2 -> 1 -> 0. 每一類都減少1,即 i 上公升 1 而 k 每一組的第一次終止條件都減少 1.然而這個規律僅僅是第乙個結束條件.再根據剛剛的步長為1 的條件我就可以輕鬆的寫出 i, j, k之間的關係式,即

k < len - i + j

這樣我們就可以寫出核心**了

for (int i = 0; i < len; i++)}}

逆序輸出就把第三個迴圈的結束與開始換一換就行

最後貼**

記得自己先試一試!!!

#include #include 

#include

#define maxsize 110

intmain()

printf(""

);

for (int k = len - i + j - 1; k >= j; k--)

printf("\n

");}

}return0;

}

o(2n^3)

2019-10-10 

更新一下用庫函式的寫法

1/**

2* @brief 字串以及逆序字串

3* @note strrevn函式只在gcc中可用linux和cb都是gcc的直譯器

4* @author 楊文蓁的小迷弟5*/

6 #include 7 #include 8 #include

9 #include 10

#define maxsize 101

1112

intmain()

1320/**

21* @brief 查詢最大子串

22* @note 非kmp

23* @param *original: 最短的輸入字串

24* @param arraystrsize: 字串陣列大小

25* @retval 字串長度

26* @author 楊文蓁的小迷弟

27*/

28void searchmax(char *original, int

arraystrsize)

2947

}48 }

庫函式演算法多艱,諸君共勉~~~

下五子棋的bot 五子棋演算法

include include include include include include jsoncpp json.h c 編譯時預設包含此庫 define n 7 每個節點的分支數 以下為各棋型的識別碼 權重 define win 1 4000 define lose 2 4000 defi...

五子棋(vb演算法)

for i 1 to 11 for j 1 to 11 if map i,j a and map i 1,j 1 a and map i 2,j 2 a and map i 3,j 3 a and map i 4,j 4 a then gameover a exit function next j ...

五子棋演算法3

這裡設計和實現了乙個人機對下的五子棋程式,採用了博弈樹的方法,應用了剪枝和最大最小樹原理進行搜尋發現最好的下子位置。介紹五子棋程式的資料結構 評分規則 勝負判斷方法和搜尋演算法過程。一 相關的資料結構 關於盤面情況的表示,以鍊錶形式表示當前盤面的情況,目的是可以允許使用者進行悔棋 回退等操作。cli...