字串匹配,字串匹配演算法
http://zju.acmclub.com/index.php?app=problem_title&id=1&problem_id=1055
需要注意的是,‘aaaa’的子串‘aa’在其中出現的次數為3,而不是2;如果用string.count()得到的結果是2。
故自己寫一個函數,使子串B在A中比較時每次只向右移1格,而不是移動len(B)格
代碼:
#b in adef mycount(a,b): if a=='' or b=='': return 0 count = 0 j = 0 while True: if b == a[j:(len(b)+j)]: count += 1 j += 1 if j + len(b)>len(a):break return countwhile True: A = raw_input() B = raw_input() lst = [] sumi = 0 for i in range(0,len(B)): lst.append(B) B = B[1:len(B)] + B[0] lst2 = list(set(lst)) #print lst2 for i in lst2: sumi += mycount(A,i) print sumi
對於一個字串匹配演算法
我看了一下代碼的,大概覺得它主要實現的功能是尋找*y對應字串中是否有與*x對應的字串相等的子字串存在,如果存在則返回該子串第一個字元在*y中的位置。
但是你沒有把問題說清楚,比如preBmBc和memcmp這兩個函數是在你給的程式中沒有定義的,我猜了好久都不能猜出他們確切的用途。我估計你們老師主要也是叫你們實現這兩個函數吧。。
如果你能在把問題給得詳細的。。我可以繼續幫你想想。。
不愧是畢業設計的題目啊,確實有點難度啊。我覺得那個函數不是一個簡單的字串匹配演算法,它是一個多重字串匹配演算法。我給你個C語言的例子你參考一下吧。一下兩下我也搞不出來了,真不好意思。
boyermoore演算法的sample程式
TCHAR * BoyerMooreSearch(TCHAR *sSrc, TCHAR *sFind)
{
//
// 聲明:
// 該段代碼只是BoyerMoore(名字也許不準確)的基本思想,當
// 然不是最優的,具體完善工作就留給你自己樂!嘻嘻。
// 該演算法的本質就是從字串的右端而不是左端開始比較,這
// 樣,當查詢不匹配時才有可能直接躍過多個字元(最多可以躍過
// strlen(sFind)個字元),如果最右邊的字元匹配則回溯。比如:
//
// pain
// ^ 這是第一次比較n和空格比
// The rain in SpainThe rain in Spain
//
// pain
// ^ 這是第二次比較,好爽呀!
// The rain in SpainThe rain in Spain
//
// 當然,這樣比較會產生一些問題,比如:
//
// pain
// ^ (圖1)
// The rain in SpainThe rain in Spain
//
// 如果比較到這兒,大家都會看到,只需再向後移到兩個字元
// 就匹配成功了,但如果接下去還按上面的方法跳strlen(sFind)的
// 話,就會錯過一次匹配!!!!!
//
// pain
// ^
// The rain in SpainThe rain in Spain
//
// 怎麼辦?當然可以解決!大家回頭看圖1,當時a是pain的子
// 串,說明有可能在不移動strlen(sFind)的跨度就匹配成功,那就
// 人為地給它匹配成功的機會嘛!串一下pain串,直接讓兩個a對齊
// 再做比較!呵呵,如果要比較的字元不是pain的子串,當然就可
// 以直接跨過strlen(sFind)個字元了!不知我說明白沒?
//
//
// 查詢串的長度
int nLenOfFind = lstrlen(sFind);
// 被查詢串的長度
in......餘下全文>>
對於一個字串匹配演算法
我看了一下代碼的,大概覺得它主要實現的功能是尋找*y對應字串中是否有與*x對應的字串相等的子字串存在,如果存在則返回該子串第一個字元在*y中的位置。
但是你沒有把問題說清楚,比如preBmBc和memcmp這兩個函數是在你給的程式中沒有定義的,我猜了好久都不能猜出他們確切的用途。我估計你們老師主要也是叫你們實現這兩個函數吧。。
如果你能在把問題給得詳細的。。我可以繼續幫你想想。。
不愧是畢業設計的題目啊,確實有點難度啊。我覺得那個函數不是一個簡單的字串匹配演算法,它是一個多重字串匹配演算法。我給你個C語言的例子你參考一下吧。一下兩下我也搞不出來了,真不好意思。
boyermoore演算法的sample程式
TCHAR * BoyerMooreSearch(TCHAR *sSrc, TCHAR *sFind)
{
//
// 聲明:
// 該段代碼只是BoyerMoore(名字也許不準確)的基本思想,當
// 然不是最優的,具體完善工作就留給你自己樂!嘻嘻。
// 該演算法的本質就是從字串的右端而不是左端開始比較,這
// 樣,當查詢不匹配時才有可能直接躍過多個字元(最多可以躍過
// strlen(sFind)個字元),如果最右邊的字元匹配則回溯。比如:
//
// pain
// ^ 這是第一次比較n和空格比
// The rain in SpainThe rain in Spain
//
// pain
// ^ 這是第二次比較,好爽呀!
// The rain in SpainThe rain in Spain
//
// 當然,這樣比較會產生一些問題,比如:
//
// pain
// ^ (圖1)
// The rain in SpainThe rain in Spain
//
// 如果比較到這兒,大家都會看到,只需再向後移到兩個字元
// 就匹配成功了,但如果接下去還按上面的方法跳strlen(sFind)的
// 話,就會錯過一次匹配!!!!!
//
// pain
// ^
// The rain in SpainThe rain in Spain
//
// 怎麼辦?當然可以解決!大家回頭看圖1,當時a是pain的子
// 串,說明有可能在不移動strlen(sFind)的跨度就匹配成功,那就
// 人為地給它匹配成功的機會嘛!串一下pain串,直接讓兩個a對齊
// 再做比較!呵呵,如果要比較的字元不是pain的子串,當然就可
// 以直接跨過strlen(sFind)個字元了!不知我說明白沒?
//
//
// 查詢串的長度
int nLenOfFind = lstrlen(sFind);
// 被查詢串的長度
in......餘下全文>>