Python字串處理演算法 一

2021-04-17 06:05:45 字數 1832 閱讀 1846

cic

內部的核心軟體系統都是搭建在

linux

上的,為了方便程式間的協同操作,我們還編寫了很多

shell script

,儘管類似

grep, sort, cut

之類的工具用起來很爽很強大,但是

shell

指令碼並不適於描述稍微複雜些的邏輯跟演算法,譬如我曾經寫過這樣的**,猜猜它是做什麼的

text=abcde

echo $text|sed -r 's/(.)//1 /g'|cut -d" " -f1,2,3|sed 's/ //g'

其實呢,就是取字串

'abcde'

的前三位,輸出結果是

'abc'

如果程式裡充滿類似的**,不難想象其可讀性和可維護性都不會好到**去,因此我們正在嘗試其他的指令碼作為補充,

python

就是乙個理想的選擇。為什麼

沒選其他語言呢,答案很簡單:據說

google

也用python...

他們的選擇總歸不會太糟,我們也就懶得花時間挑了。

用python

來實現上面同樣的功能,很簡單

, text="abcde";text[0:3]

作為我個人學習的一部分,我打算用

python

實現《演算法導論ii》

中的一些經典演算法,並且記錄下來,和大家分享

我首先選擇了第

32章,即字串匹配作為這系列文章的開始,畢竟我們內部的程式涉及大量的文字分析操作,用

python

來重新實現其中一些,也是溫故知新,會更有效果。

在實現的過程中我發現,

python

語法和書中偽碼很相像,加上命令的執行可以立竿見影,實在是非常適合用於教學的語言。只是需要注意的是書中偽碼的字串起始下標為

1,結束下標是閉區間, 而

python

中字串起始下標為

0(當作乙個

list

進行slice),

操作時的結束下標為開區間。因此書中偽碼翻譯為

python

時所有字串起始下標都需要減

1,而結束下標不變。

先用python

的語法簡單描述一下何謂字串匹配演算法,一些對變數的大小約束這裡不再贅述。

假設有長度為

m 的模式字串p,

長度為n

的文字t

,如果p

出現在t

的偏移s

處,則有

p[0:m] = t[s-1: s+m]

說到這裡,我們可以先在

python

的互動環境中實驗一下:

輸入p="cde"

t="abcde"

p[0:3] == t[2:5] == "cde"

輸出true

從而證明

p 出現在

t 的偏移2處

那麼什麼是字串匹配演算法呢,這類演算法就是要在文字

t 中找到所有出現模式字串

p 的偏移位置。

接下來同樣用

python

的語法來描述一些術語

有兩個字串變數x 和

yx 和y

相結合(concatenation):  x+yx 是

y 的字首

(prefix):         x.startswith(y)x 是

y 的字尾

(suffix):         x.endswith(y)

x 的包含

k個字元的字首:

x[0:k-1]

字串基本處理演算法

最近想寫寫字串處理方面的東西。前面已經寫寫了字串分割函式的實現。下面再將幾種常見的字串處理演算法實現了下。第乙個為統計字串的長度函式,很簡單,定義乙個指標指向字串首位,然後從頭遍歷到字串的尾部,遇到 0 就停止,同時定義乙個變數累加。下面直接貼 int stringlen char str 第二函式...

演算法歸納系列 字串處理演算法

常見思路是在s中遍歷尋找str,演算法複雜度為o len str len s kmp演算法能將複雜度降低到o len s 級別,kmp演算法的思想主要是通過求匹配字串每個位置的最長重複字首,每次匹配失敗之後就直接用next陣列中的最長匹配字首那一部分去匹配,而不用重新匹配。vectorgetnext...

演算法 字串處理

輸入乙個字串,列印出該字串中字元的所有排列。例如,輸入字串abc,則列印出由字元a b c所能排列出來的所有字串abc,acb,bac,bca,cab,cba.我們求整個字串的排列,可以分成兩步,第一步求所有可能出現在第乙個位置的字元,即把第乙個字元與後面所有字元交換。第二步,固定第乙個字元,求後面...