повторение строк заменено дефисом с ++ - PullRequest
1 голос
/ 19 сентября 2019

Я новичок в кодировании и пробовал этот вопрос, который заменяет все повторения буквы в строке на дефис: т.е. ABCDAKEA станет ABCD-KE-. Я использовал цикл переключения, и он работает, но я хочучтобы сделать его короче и, возможно, использовать рекурсию, чтобы сделать его более эффективным.Есть идеи?

    #include<iostream>
    #include<string.h>
    using namespace std;
    int main()
    {
    char x[100];    
    int count[26]={0}; //initialised to zero
    cout<<"Enter string: ";
    cin>>x;
    for(int i=0; i<strlen(x); i++)
    {
    switch(x[i])
    {
    case 'a':
        {
        if((count[0]++)>1)
        x[i]='-';
        }
    case 'b':
        {
        if((count[1]++)>1)
        x[i]='-';
        }
    case 'c':
        {
        if((count[2]++)>1)
        x[i]='-';
        }
        //....and so on for all alphabets, ik not the cutest//
      }
      }

Ответы [ 4 ]

1 голос
/ 19 сентября 2019

Перебирайте пропуски массива, пропуская и помещайте символы, с которыми вы никогда не сталкивались, в std::set, если вы найдете их снова, вы помещаете их в дубликаты std::set, если вы хотите отслеживать, сколько дубликатовв противном случае измените значение исходной строки в этом месте на дефис.

#include <iostream> 
#include <string>
#include <cctype>
#include <set>

int main() {
    std::string s("Hello world");
    std::set<char> characters;
    std::set<char> duplicates;

    for (std::string::size_type pos = 0; pos < s.size(); pos++) {
        char c = s[pos];

        // std::isspace() accepts an int, so cast c to an int
        if (!std::isspace(static_cast<int>(c))) {
            if (characters.count(c) == 0) {
                characters.insert(c);
            } else {
                duplicates.insert(c);
                s[pos] = '-';
            }
        }
    }

return 0;
}
1 голос
/ 19 сентября 2019

Наивный (неэффективный), но простой подход, требует как минимум C ++ 11.

#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>

std::string f(std::string s)
{
  auto first{s.begin()};
  const auto last{s.end()};
  while (first != last)
  {
    auto next{first + 1};
    if (std::isalpha(static_cast<unsigned char>(*first)))
      std::replace(next, last, *first, '-');
    first = next;
  }
  return s;
}

int main()
{
  const std::string input{"ABCDBEFKAJHLB"};
  std::cout << f(input) << '\n';
  return 0;
}
0 голосов
/ 20 сентября 2019

Во-первых, обратите внимание, что английские заглавные буквы в таблице ASCII попадают в этот диапазон 65-90.Если использовать прописную букву static_cast<int>('A'), получится целое число.Если после обводки число находится между 65-90, мы знаем, что это заглавная буква.Для маленьких букв диапазон составляет 97-122.В противном случае символ не является буквой в принципе.

Проверьте, создайте массив или вектор bool и отследите повторяющиеся буквы.Простым подходом является

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
    string str("ABCDAKEAK");
    vector<bool> vec(26,false);

    for(int i(0); i < str.size(); ++i){
        if(  !vec[static_cast<int>(str[i]) - 65]  ){
            cout << str[i];
            vec[static_cast<int>(str[i]) - 65] = true;
        }else{
            cout << "-";
        }   
    }
    cout << endl;

    return 0;
}

Примечание: я предполагаю, что ввод только буквы, и они являются заглавными.Идея сосредоточена вокруг отслеживания с помощью bool.

0 голосов
/ 19 сентября 2019

Если вы предполагаете, что кодировкой входного характера является UTF-8, вы можете выполнить рефакторинг, как показано ниже:

#include <iostream>
#include <string>
#include <optional>
#include <utility>
std::optional<std::size_t> char_to_index(char u8char){
    if (u8'a' <= u8char && u8char <= u8'z'){
        return u8char - u8'a';
    }
    else if (u8'A' <= u8char && u8char <= u8'A'){
        return u8char - u8'A';
    }
    else {
        return std::nullopt;
    }
}
std::string repalce_mutiple_occurence(std::string u8input, char u8char)
{
    bool already_found[26] = {};
    for(char& c : u8input){
        if (const auto index = char_to_index(c); index && std::exchange(already_found[*index], true)){
            c = u8char;
        }
    }
    return u8input;
}
int main(){
    std::string input;
    std::getline(std::cin, input);
    std::cout << repalce_mutiple_occurence(input, u8'-');
}

https://wandbox.org/permlink/UnVJHWH9UwlgT7KB

примечание: на C ++ 20 вы должны использовать char8_t вместо использования char.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...