讀程式設計師程式設計藝術第二章 字串包含問題

2021-06-21 02:06:39 字數 1248 閱讀 9329

字串包含問題:

即乙個字串是否包含另乙個字串。這個問題雖然比較簡單,但是想要優化輪詢的時間複雜度卻不是那麼的簡單。

最常見的方法就是針對乙個字串的字元,一一與另乙個字串中的字元相比較,看他們是否都在其中。

即方法一:o(n*m)的輪詢方法,由於這種方法比較簡單,**我就不貼了。

方法二:基於o(mlogm

)+o(nlogn)+o(m+n)的排序方法 的輪詢,下面重點介紹這種方法。

我們知道如果首先排序兩個字串,在同時針對兩個字串輪詢降低時間複雜度。而快速排序的時間複雜度為o(nlogn)最後的線性掃瞄也需要o(m+n)次操作。故最後的時間複雜度為o(mlogm)+o(nlogn)+o(m+n)。

首先我們來看一下快速排序演算法。例如要將4,3.5,6,7,8,9,10,2排序。

**編寫如下:

//分界函式

int partrition(int s,int l,int r)

if(i

總結:快速排序採用的是分治的策略

1、將起始位置的數x設定為軸,定義指標i,j分別指向最開始和最末尾的元素

2、從右往左尋找比x小的數,如果滿足,就將s[i]用s[j]填充並將i++,這時相應位置的s[j]空出

3、從左往右尋找比x大的數,如果滿足,就將s[j](就是剛剛空出的s[j])用s[i]填充,此時相應的s[i]又會空出

4、如果此時i

5、將key值填回s[i]

6、返回軸

好了上面簡單的介紹了快速排序演算法。但是我們現在要排序是字串,我們將快速排序演算法稍加改動,編寫**如下:

//分界函式

int partrition(string &s,int l,int r)

if(i

判斷字串是否包含的完整**編寫如下:

#include"stdafx.h"

#include#include"string"

#include"iostream"

using namespace std;

//分界函式

int partrition(string &s,int l,int r)

if(i

從上面可以看出,快速排序的時間複雜度分別是o(nlogn)+o(mlogm),而線性掃瞄的時間複雜度為0(m+n)。如此,總的時間複雜度為o(nlogn)+o(mlogm)+0(m+n)。

程式設計師程式設計藝術 第二章筆記

誤中陣列o m n 演算法。void note char str,int flag int quary char longstr,int flag while j 26 j return 1 int main void char longstr abcdefghlmnopqrs char short...

windows核心程式設計第二章 字串

今天看了一遍字串,總結下 寫了書中的例子因為是寫在dll裡的,所以淺淺的學習了下dll的寫法 def檔案很簡單 library win32dll exports sfstringreversew 1即可 2 在vs2005中選擇 win32工程,ok後再選擇dll或者exe,dll會自己寫好dllm...

第二章 字元和字串處理

一 tchar c text a tchar szbuffer 100 text a string 無論使用ansi還是unicode字元,編譯器都能通過編譯。二 在使用winexec和openfile呼叫的地方,應該用createprocess和createfile呼叫來代替。三 應當遵循的基本準...