2016-11-24 107 views
-1

的一個子我有一個像檢查字符串矢量是元素

a1 = ["arp", "live", "strong"] 

a2 = ["lively", "alive", "harp", "sharp", "armstrong"] 

字符串矢量我將如何檢查是否阿姆斯特朗的強勁A1一子。使用C++

我會做兩個for循環,並檢查一個字符串是否是a2中的子字符串,但我想要一個有效的方法。

std::vector<std::string> inArray(std::vector<std::string> &array1, std::vector<std::string> &array2) 
{ 
    vector<string> result; 
    for (string &s : array1) 
    { 
     for (string &d : array2) 
     { 

      if (s.find(d) != string::npos) 
      { 
       cout << d << endl; 
      } 
     } 

    } 

    return result; 

} 

int main() { 

    vector<string> a = { "arp", "live", "strong" }; 
    vector<string> b = { "lively", "alive", "harp", "sharp", "armstrong" }; 

    vector<string> result = inArray(a, b); 

} 

鑑於串a1的兩個陣列和A2中是a2的字符串的子串a1的字符串的詞典順序返回一個排序後的數組河

Example 1: 

a1 = ["arp", "live", "strong"] 

a2 = ["lively", "alive", "harp", "sharp", "armstrong"] 

returns ["arp", "live", "strong"] 
+0

你爲什麼覺得它效率不高,你有沒有測量過它?如果是這樣,發佈代碼 –

+0

它是O(N * M)。會比這更好嗎? –

+1

「我將如何檢查阿姆斯特朗是否是a1中強子的一個子字符串」難道你不想檢查其他方式嗎? –

回答

0

第一:使用名稱的變量和函數,可以很容易識別的目的

二:矢量不會奇蹟般地填補本身。

三:您正在搜索的字符串中的滿弦(見第一)

四:以const引用傳遞的價值,如果你不修改它的計劃。

第五:根據你的預期答案,你不想重複。我建議爲此使用std::set,因爲它不允許重複。

#include <vector> 
#include <set> 
#include <string> 
#include <iostream> 

using std::set; 
using std::vector; 
using std::string; 
using std::cout; 

set<string> getMatchingSubstrings(const vector<string> &subStrings, const vector<string> &fullStrings) 
{ 
    set<string> result; 
    for (const string &fullString : fullStrings) 
    { 
     for (const string &subString : subStrings) 
     { 
      if (fullString.find(subString) != string::npos) 
      { 
       result.insert(subString); 
      } 
     } 

    } 
    return result; 
} 

int main() { 

    vector<string> a = { "arp", "live", "strong" }; 
    vector<string> b = { "lively", "alive", "harp", "sharp", "armstrong" }; 
    set<string> result = getMatchingSubstrings(a, b); 
} 

稍快的做法可能會被刪除已經找到從最初的名單子,所以你不必檢查這些兩倍。在這種情況下,結果將不會被排序,所以如果您需要再次排序,這可能不是最好的選擇。

#include <vector> 
#include <string> 
#include <iostream> 

using std::vector; 
using std::string; 
using std::cout; 

std::vector<std::string> getMatchingSubstrings(const std::vector<std::string> &subStrings, const std::vector<std::string> &fullStrings) 
{ 
    vector<string> unmatchedSubStrings = subStrings; 
    vector<string> matchedSubStrings; 
    for (const string &fullString : fullStrings) 
    { 
     if (unmatchedSubStrings.empty()) break; 
     for (auto subStringIter = unmatchedSubStrings.begin(); subStringIter != unmatchedSubStrings.end();) 
     { 
      const string& subString = *subStringIter; 
      if (fullString.find(subString) != string::npos) 
      { 
       matchedSubStrings.push_back(subString); 
       subStringIter = unmatchedSubStrings.erase(subStringIter); 
      } 
      else 
      { 
       ++subStringIter; 
      } 
     } 
    } 

    return matchedSubStrings; 
} 

int main() { 

    vector<string> a = { "arp", "live", "strong" }; 
    vector<string> b = { "lively", "alive", "harp", "sharp", "armstrong" }; 

    vector<string> result = getMatchingSubstrings(a, b); 

} 
相關問題