題目:
有一字串由m個單詞組成單詞之間有空格隔開(只有空格,沒有其他標點符號),有n個關鍵字,現在要在字串中找出包含n個關鍵字(每個關鍵字至少出現一次,沒有說要不要按什麼順序)的最短子串。函式原型:string extractsummary(string description, string keywords)
思路:想了一陣,想出了乙個方法,設主串長n 關鍵字長m 則複雜度大致為nlogm
舉個例子說下過程:
例如主串: ab ba ad ba ab ef ba ab ef ad
關鍵字集合 ab ef ad
則查詢過程如下:
起始掃瞄到ab,ab出現次數加一,start賦值0,此時出現了乙個關鍵字
掃瞄到ba,發現不是關鍵字,則跳過
掃瞄到ad,將ad出現次數加一,將上一次掃瞄到的關鍵字ab的next[0]賦值2,此時一共出現了2個關鍵字
掃瞄到ba,不是關鍵字跳過
掃瞄到ab,將ab出現次數加一,發現start所指的關鍵字出現了兩次,因此start所指關鍵字是多餘的,將start指向的關鍵字ab出現次數減一,並令start=next[start],重複這個過程直至start所指關鍵字
只出現一次,
掃瞄到ef,將next[4]賦值5,此時start=2,將ef出現次數加一,此時發現3個關鍵字均已出現,判斷是否為當前最優解....
掃瞄ba,不是關鍵字跳過
掃瞄ab,將上次出現關鍵字ef的下乙個關鍵字next[5]賦值7,將ab出現次數加一
掃瞄ef,將上次出現關鍵字ab的下乙個關鍵字next[7]賦值8,將ef出現次數加一
掃瞄ad,將上次出現關鍵字ef的下乙個關鍵字next[8]賦值9,將ad出現次數加一,發現start所指關鍵字出現多次,因此將start所指關鍵字出現次數減一, 利用next陣列不斷跳轉,直至start所指關鍵字只出現一次為止
根據上面過程,可以得到最優解起始8 長度3
程式如下,沒按照給的函式名,直接寫在主函式了:
輸入:10
ab ba ad ba ab ef ba ab ef ad
3ab ef ad
輸出8 3
證明下上面演算法的正確性:
設包含所有關鍵字的最短區間起始位置start, 終止位置i, 則可以推出如下性質:
1. start所指向的單詞一定是關鍵字.(否則必然能縮短區間長度)
2. start所指向的關鍵字必然在這個最短區間內只出現一次,(否則區間長度至少還能縮小1)
證明:當區間末尾掃瞄到i時,由於[start , i]包含了所有關鍵字,由於start所指向的關鍵字只在該區間內出現
一次,因此由"while(everkeynum[j]>1)"迴圈可知必然會在start處停止,此時會更新以前儲存的最短長度,故該方法能找到解.
嫌麻煩直接開了個next陣列,呵呵,有點浪費空間,可以用鍊錶實現next陣列節省空間....
在乙個字串中尋找另外乙個字串
在乙個字串中尋找另外乙個字串 public class text foundit true break test system.out.println foundit?found it didn t find it 該段程式有點難以理解,主要就是if語句的理解,if searchme.charat ...
php判斷乙個字串包含另乙個字串
a 58252,58253 如果 a 中存在 b,則為 true 否則為 false。b 58253 if strpos a,b false else 查詢字串在陣列中出現的次數 array array 1,hello 1,world hello 11 計算 string在 array 需為陣列 中...
SQL 判斷乙個字串是否在另外乙個字串中
eg str1 admin str2 1234,123admin,xcxx 比較str1是否在str2中 用常用的charindex,返回肯定是有值的,這裡自己動手寫乙個方法 檢查乙個字串是否在另外乙個字串中數,另外乙個字串元素用,隔開 create function dbo checkstrina...