Trang chủ Tin Học Lớp 8 Hai xâu kí tự S1 và S2 được gọi là hai xâu họ hàng nếu mỗi kí tự có ở...
Câu hỏi :

Hai xâu kí tự S1 và S2 được gọi là hai xâu họ hàng nếu mỗi kí tự có ở xâu này đều có ở xâu kia và ngược lại. Hai xâu rỗng cũng được xem là hai xâu họ hàng. Ví dụ: S1 = aabccdcbe; S2 = abcde là hai xâu họ hàng. Yêu cầu: Nhập từ bàn phím hai xâu kí tự S1 và S2 (tối đa 255 kí tự) chỉ chứa chữ cái thường và không phải là hai xâu họ hàng. Hãy tìm cách xóa ít nhất một số kí tự ở mỗi xâu (cũng có thể chỉ xóa ở một xâu) để được hai xâu kí tự mới là hai xâu họ hàng. Dữ liệu vào: Nhập từ bàn phím hai xâu S1 và S2 có độ dài không quá 255 kí tự. Dữ liệu ra: In ra màn hình số kí tự đã xóa trong hai xâu. Ví dụ: Nhập từ bàn phím In ra màn hình S1 = ababcdecb S2 = abmed giai =c++ nha

Lời giải 1 :

Xóa như thế nào? Ta biết nếu `S1 = S2` trong dạng tập hợp thì `S1` và `S2` là xâu họ hàng, tức ta cần giữ lại phần giao của `S1` và `S2`, tức `S1 \cap S2`.

Làm sao để tìm `S1 \cap S2`? Ta có thể sử dụng CTDL set, nhưng để thuận tiện, ta nên sử dụng CTDL multiset hoặc map, ... Mình sẽ sử dụng multiset trong câu trả lời này.

Làm sao để tìm số kí tự bị xóa? Đơn giản là ta chỉ cần lấy số kí tự ban đầu trừ cho số kí tự sau khi xóa.

$\\$

$\color{#1fdb91}{\texttt{C}}\color{#0aaec9}{\texttt{+}}\color{#e9418e}{\texttt{+}}$

#include <bits/stdc++.h>

#define all(v) v.begin(), v.end()

using namespace std;

void Erase(multiset<char> &S1, multiset<char>& S2, set<char> tmp) {
    for (auto c:tmp) {
        if (S2.find(c) == S2.end()) S1.erase(c);
    }
}

int main() {
    
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    string s1, s2;
    getline(cin, s1);
    getline(cin, s2);
    
    multiset<char> S1(all(s1)), S2(all(s2));
    
    Erase(S1, S2, set<char>(all(s1)));
    Erase(S2, S1, set<char>(all(s2)));
    
    cout << (s1.size() - S1.size()) + (s2.size() - S2.size());
    
}

// Author : Daoanhviet96
// Language : C++

$\\$
\begin{array}{c|c|c}\color{#ffd710}{\texttt{\{}} \color{#8655d6}{\texttt{\{}}\ \ \color{#8cdcda}{\text{Daoanhviet96}}\ \ \color{#8655d6}{\texttt{\}}} \color{#ffd710}{\texttt{\}}}\end{array}

image

Lời giải 2 :

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main ()
{
  string str1, str2;
  cin >> str1 >> str2;
  vector <char>s1 (str1.begin (), str1.end ());
  vector <char>s2 (str2.begin (), str2.end ());
ll dem = 0,i=0;
  while (i<s1.size ())
    {
     while (find (s2.begin (), s2.end (), s1[i]) == s2.end ())
 {s1.erase (s1.begin () + i);
   dem++;
 }
      i++;
    }
  i = 0;
  while (i < s2.size ())
    {
      while (find (s1.begin (), s1.end (), s2[i]) == s1.end ())
 {
   s2.erase (s2.begin () + i);
   dem++;
 }
      i++;
    }
    cout << dem;
}

image

Bạn có biết?

Tin học là một ngành khoa học chuyên nghiên cứu quá trình tự động hóa việc tổ chức, lưu trữ, xử lý và truyền dẫn thông tin của một hệ thống máy tính cụ thể hoặc trừu tượng. Tin học bao hàm tất cả các nghiên cứu và kỹ thuật có liên quan đến việc mô phỏng, biến đổi và tái tạo thông tin. Hãy tận dụng sức mạnh của tin học để giải quyết các vấn đề và sáng tạo ra những giải pháp mới!

Nguồn :

Wikipedia - Bách khoa toàn thư

Tâm sự lớp 8

Lớp 8 - Năm thứ ba ở cấp trung học cơ sở, học tập bắt đầu nặng dần và sang năm lại là năm cuối cấp, áp lực lớn dần. Hãy chú ý đến sức khỏe, cân bằng giữa học và nghỉ ngơi để đạt hiệu quả tốt nhất!

Nguồn :

sưu tập

Copyright © 2024 Giai BT SGK