2017-08-29 64 views
-1

我發現此問題發佈在此處,但無法評論或提出問題,所以我創建了一個新問題。這段代碼發生了什麼。字符串作爲字符串中的子字符串

原來的職位說明如下:

t = "abd" 
s = "abdc" 

小號平凡包含噸。然而,當你對它們進行排序時,你會得到字符串abd和abcd,並且比較失敗。排序會得到其他字母。

相反,您需要以大小爲t的塊來逐步完成s。

t_len = len(t) 
s_len = len(s) 
t_sort = sorted(t) 
for start in range(s_len - t_len + 1): 
    chunk = s[start:start+t_len] 
    if t_sort == sorted(chunk): 
    # SUCCESS!! 

在for循環中,他們爲什麼要用S-len然後減去t_len?爲什麼他們最後加1?

+2

因爲's_len - t_len + 1'子字符串中最多隻能有't_len'。總而言之,在一個4字符的字符串中,每個字符串最多可以有2個子字符串。也就是說,前3個字符和後3個字符,「abd」和「bdc」。 – alvits

+4

這實際上是創建一個窗口的大小(len(t)),然後你滑過len(s)。即檢查s中長度爲len(t)的所有連續子串。在這個例子中,長度爲3的2個子字符串。 –

+0

謝謝你幫助澄清事情。 – john

回答

0

alvitsd_void已經解釋的start值;我不會重複這一點。

我強烈建議您學習一些基本的跟蹤調試。插入一些有用的print語句以跟蹤執行。例如:

代碼:

t = "goal" 
s = "catalogue" 

t_len = len(t) 
s_len = len(s) 
t_sort = sorted(t) 
print "lengths & sorted", t_len, s_len, t_sort 

for start in range(s_len - t_len + 1): 
    chunk = s[start:start+t_len] 
    print "LOOP start=", start, "\tchunk=", chunk, sorted(chunk) 
    if t_sort == sorted(chunk): 
     print "success" 

輸出:

lengths & sorted 4 9 ['a', 'g', 'l', 'o'] 
LOOP start= 0 chunk= cata ['a', 'a', 'c', 't'] 
LOOP start= 1 chunk= atal ['a', 'a', 'l', 't'] 
LOOP start= 2 chunk= talo ['a', 'l', 'o', 't'] 
LOOP start= 3 chunk= alog ['a', 'g', 'l', 'o'] 
success 
LOOP start= 4 chunk= logu ['g', 'l', 'o', 'u'] 
LOOP start= 5 chunk= ogue ['e', 'g', 'o', 'u'] 

這是否有助於說明發生了什麼事的循環?

+0

你完全誤解了這個問題。 OP在問爲什麼「開始」使用這樣一個範圍。你甚至沒有解釋任何事情。你剛纔提出了一個建議。這不是一個答案。這屬於評論。 – alvits

+0

你已經解釋了'start'的值;我應該參考一下。不幸的是,這不能發表評論,因爲它不會格式化代碼和輸出。 – Prune

+0

嘿Prune謝謝你關於打印報告的例子。但是,你誤解了被問到的問題。 – john