Операции Bitshift и битовая маска не обнаруживают дубликаты - PullRequest
0 голосов
/ 15 февраля 2020

Я пытался написать программу, которая проверяет наличие повторяющихся букв в нижнем регистре, используя битовую маску. Однако программа возвращает true независимо от наличия дубликата письма. Код выглядит следующим образом:

#include <iostream>
#include <cctype>
#include <cstring>

using namespace std;

bool all_unique_letters(const string &s) {
    int bitset;

    for(char const &c : s)
    {
        unsigned char set = 1 << (c - 'a');

        if(set & bitset)
            return false;

        bitset |= set;
    }

    return true;
}

int main(int argc, char * const argv[]) {
    // TODO: reads and parses command line arguments.
    // Calls other functions to produce correct output.
    if(all_unique_letters(argv[1]))
        cout << "All letters are unique!" << endl;
    else
        cout << "Duplicate letters found." << endl;
}

1 Ответ

0 голосов
/ 15 февраля 2020

Я вижу две проблемы. Сначала ваша переменная bitset неинициализирована. Во-вторых, тип вашей переменной set равен unsigned char 8-битного типа. Для строчного алфавита вам нужно как минимум 26 бит для проверки на bitset. После устранения обеих проблем ваш код работает.

bool all_unique_letters(const string &s) {
    int bitset = 0; // fixed

    for(char const &c : s)
    {
        int set = 1 << (c - 'a'); // fixed

        if(set & bitset)
            return false;

        bitset |= set;
    }
    return true;
}
...