2017-08-11 22 views
-3

我想知道如何從容器中刪除重複的字符串,但忽略來自標點符號的單詞差異。給定一個字符串數組我如何刪除重複項?

例如,給定這些字符串:

爲什麼這樣做,我們在這裏,我們在這裏?

我想獲得這個輸出:

我們爲什麼在這裏?

+1

[Tokenize string。](https://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c) – Mahesh

+1

[最優雅的方式分裂字符串?](https:// stackoverflow .com/questions/236129/most-elegant-way-to-split-a-string) –

+0

@Leonardo你能告訴我怎麼做嗎? – Shubham

回答

0

算法:

  1. 而讀一個字是成功的,做的事:
  2. 如果文件結束,退出。
  3. 如果單詞列表爲空,則推回單詞。
  4. else begin
    搜索單詞的單詞列表。
  5. 如果單詞不存在,則推回單詞。
    結束否則(步驟4)
  6. 結束(在閱讀一個字)

使用std::string了你的話。 這可以讓你做到以下幾點:

std::string word; 
while (data_file >> word) 
{ 
} 

使用std::vector包含你的話(雖然你可以使用std::list爲好)。 std::vector動態增長,所以你不必擔心如果你選擇了錯誤的大小重新分配。
要附加到std::vector,請使用push_back方法。

比較std::string,使用operator==

std::string new_word; 
std::vector<std::string> word_list; 
//... 
if (word_list[index] == new_word) 
{ 
    continue; 
} 
0

所以you have said你知道如何來標記一個字符串。 (如果你不花時間在這裏:https://stackoverflow.com/a/38595708/2642059)所以我假設我們得到了一個vector<string> foo,其中包含可能帶有標點符號的單詞。

for(auto it = cbegin(foo); it != cend(foo); ++it) { 
    if(none_of(next(it), cend(foo), [&](const auto& i) { 
                 const auto finish = mismatch(cbegin(*it), cend(*it), cbegin(i), cend(i)); 
                 return (finish.first == cend(*it) || !isalnum(*finish.first)) && (finish.second == cend(i) || !isalnum(*finish.second)); 
                 })) { 
     cout << *it << ' '; 
    } 
} 

Live Example

值得注意這裏,你沒有給我們如何處理這樣的話規則「下」,「downvote」和「downvote」這種算法中假設1 st 2是相等的。你也沒有給我們規定如何處理的規則:「爲什麼,我們在這裏,我們這裏?」這個算法總是返回最後的重複,所以輸出結果是「我們爲什麼在這裏?」

如果這個算法的假設並不完全符合您的喜好,請留下我的評論,我們將努力讓您對此代碼感到滿意,以便您可以進行所需的調整。

+0

我只是一個初學者。所以我會試着去理解代碼。謝謝你的回覆。 – Shubham

+0

@Shubham我鼓勵你花一些時間,因爲我相信這是你的問題的最佳解決方案。我已經提供了Live示例,您可以使用這些示例進行嘗試。讓我知道是否有任何具體的事情可以向我解釋。 –

相關問題