Thắc mắc về thuật toán bài xóa các từ giống nhau, chỉ giữ lại từ đầu

Bài này em không nghĩ ra được thuật toán ạ, em có lên mạng tra thử thì thấy bài như thế này. Tuy nhiên em không hiểu thuật toán của đề bài nên mong các anh/chị/bạn chỉ dẫn giúp em ạ. Em xin cảm ơn nhiều ạ.

#include<iostream>
#include <cstring>
using namespace std;
main()
{
    string str;
    cout<<"Enter your String:";
    getline(cin,str);
    int in=0,out=0,p=0,len1=0;
    char sub_str[100][100]={0};
     //splitting Input String into sub string
    while(str[p]!='\0')
    {
        out=0;
        while(str[p]!=' ' && str[p]!='\0')
        {
            sub_str[in][out]=str[p];
            p++;
            out++;
        }
        sub_str[in][out]='\0';
        in++;
        if(str[p]!='\0')
        {
            p++;
        }
    }
    cout<<"After removing duplicate words from a given String is:";
     len1=in;
    for(in=0;in<len1;in++)
    {
         for(out=in+1;out<len1;)
            if(strcmp(sub_str[in],sub_str[out])==0)
         {
             for(p=out;p<len1;p++)
             {
                 strcpy(sub_str[p],sub_str[p+1]);
             }
             len1--;
         }
         else
         {
             out++;
         }
    }
    for(in=0;in<len1;in++)
    {
        cout<<sub_str[in]<<" ";
    }
}

Đây là bài code ạ.

3 vòng lặp ngoài cùng tương đương với.

  1. Tách từ.
  2. Loại bỏ từ trùng nhau.
  3. In ra kết quả.

Vòng lặp 1: while(str[p]!='\0')

Duyệt từng ký tự của chuỗi, xét dấu phân cách (khoảng cách) để tách từng từ và đẩy vào mảng chứa từng từ riêng biệt (sub_str).

Vòng lặp 2: for(in=0;in<len1;in++)

Loại bỏ từ trùng, so sánh 2 từ (vòng ngoài và vòng lặp trong thứ 2) và nếu trùng thì dồn mảng từ phía sau đè lên (= loại bỏ) phần tử trùng (vòng lặp trong thứ 3 sau if).

In ra

Thì in mảng đã loại bỏ từ bị trùng, chả có gì để nói thêm.

Bài này từ đầu là có dùng đến string => C++, nên áp dụng các lớp và hàm bên C++ để hiệu quả hơn.

5 Likes

ồ ra là vậy, mình xin cảm ơn nhiều ạ :heart_eyes:

Dùng std::set là được, cái này là bảng tần suất từ luôn :slight_smile:

5 Likes

Code dài quá . Code lại :

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

using namespace std;

int main(int argc, char *argv[]){
    string input = "Xin chao cac ban ! Hi hi                        hi hi";
    stringstream ss(input);
    vector<string> texts;
    string token;
    while (getline(ss, token, ' ')) {
        if(token.length()<=0) continue;
        bool existing = false;
        for(auto &ex : texts){
            existing |= ex == token;
            if(existing) break;
        }
        if(!existing){
            texts.push_back(token);
        }
    }
    for(auto &text : texts){
        cout << text << endl;
    }
}

Input :

Xin chao cac ban ! Hi hi                        hi hi

Output :

Xin
chao
cac
ban
!
Hi
hi
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?