字串匹配,字串匹配演算法

來源:互聯網
上載者:User

字串匹配,字串匹配演算法

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......餘下全文>>
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.