Giúp tìm lỗi sai chuyển các kí tự giống nhau thành 1 (vd abcdabc->111d111)

#include <bits/stdc++.h>

using namespace std;
string xuat(string s)
{
     for(int i=0;i<s.size();i++)
     {
          for(int j=i;j<s.size();j++)
          {
               if(s[i]==s[j])
               s[i]='1';
               s[j]='1';
          }
     }
     return s;
}
int main()
{
    string s;
    getline(cin,s);
    cout<<xuat(s);
    return 0;
}

Do if bị thiếu ngoặc nhọn nên luôn gán s[j] bằng ‘1’.

2 Likes

mik thêm vào nhưng vẫn ko ra đúng vd abcabcabcd->111111abcd

abc giống nhau chỗ nào mà thành 111 hả bạn? :no_mouth:

tức là trong sâu có kí tự nào giống nhau thì sẽ thành 1 hết

Bạn không nghe đàn anh trên giải thích à? Câu lệnh IF của bạn phải dùng dấu sừng trâu để bọc 2 câu lệnh con lại, còn không thì nó hiểu mỗi câu đầu, còn câu sau nó chẳng quan tâm
if(s[i]==s[j])
s[i]=‘1’;
s[j]=‘1’;
sẽ phải thành:
if(s[i]==s[j]) {
s[i]=‘1’;
s[j]=‘1’;
}
Kiến thức hổng về statement và/ hoặc block.

1 Like

mik sửa theo r nhưng thử kết quả nó ra ntn image là đang sai

  1. Phải là for(int j=i+1, ...) mới đúng ý tưởng bubble check của bạn. Nếu j=i thì luôn luôn giống nhau.
  2. Ý tưởng này thực ra không chính xác vì nếu số lượng ký tự giống nhau là số lẻ thì sẽ dư ra một ký tự. Ví dụ aaa sẽ thành 11a.
  3. Nếu bạn muốn dùng ý tưởng này thì phải ghi kết quả ra một chuỗi mới.
  4. Thuật toán nhanh nhất để giải quyết bài này là dùng hash map (dictionary).
5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?