определить, содержит ли строка все уникальные символы? - PullRequest
12 голосов
/ 14 февраля 2011

Кто-нибудь может сказать мне, как реализовать программу для проверки строки, содержащей все уникальные символы?

Ответы [ 16 ]

0 голосов
/ 17 апреля 2017

это оптимальное решение проблемы. она принимает только целочисленную переменную и может сказать, является ли она уникальной или нет, независимо от размера строки.

сложность

лучший случай O (1)

худший случай O (n)

public static boolean isUniqueChars(String str) {
    int checker = 0;
    for (int i = 0; i < str.length(); ++i) {
        int val = str.charAt(i) - ‘a’;
        if ((checker & (1 << val)) > 0) 
            return false;
        checker |= (1 << val);
    }
    return true;
}
0 голосов
/ 13 ноября 2016

Я надеюсь, что это может помочь вам

#include <iostream>
using namespace std;
int main() {
 string s;
 cin>>s;
 int a[256]={0};
 int sum=0;
 for (int i = 0; i < s.length();i++){
    if(a[s[i]]==0)++sum;
    a[s[i]]+=1;
 }
 cout<<(sum==s.length()?"yes":"no");
 return 0;

}

0 голосов
/ 23 октября 2015

Я считаю, что есть гораздо более простой способ:

int check_string_unique(char *str) 
{
   int i = 0;
   int a = 0;
   while (str[i])
   {
      a = i + 1; // peak to the next character
      while (str[a])
      {
          if (str[i] == str[a]) // you found a match
             return (0); // false
          a++; // if you've checked a character before, there's no need to start at the beggining of the string each time. You only have to check with what is left.
      }
   i++; //check each character.
   }
return (1); //true!
}
0 голосов
/ 26 декабря 2014

Без использования дополнительной памяти:

#define UNIQUE_ARRAY 1
int isUniqueArray(char* string){
    if(NULL == string ) return ! UNIQUE_ARRAY;
    char* current = string;
    while(*current){
        char* next   = current+1;
        while(*next){
            if(*next == *current){
                return ! UNIQUE_ARRAY;
            }
            next++;
        }
        current++;
    }
    return UNIQUE_ARRAY;
}
0 голосов
/ 29 апреля 2014

Мой первоначальный ответ также выполнял аналогичную технику массива и подсчитывал вхождение символов.

, но я делал это в C, и я думаю, что это может быть просто, используя некоторые манипуляции с указателями и полностью избавиться от массива

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main (int argc, char *argv[])
{
    char *string;
    if (argc<2)
    {
        printf ("please specify a string parameter.\n");
        exit (0);       
    }

    string = argv[1];
    int i;

    int is_unique = 1;
    char *to_check;
    while (*string)
    {
        to_check = string+1;
        while (*to_check)
        {
            //printf ("s = %c, c = %c\n", *string, *to_check);
            if (*to_check == *string)
            {
                is_unique = 0;
                break;
            }
            to_check++;
        }
        string++;
    }

    if (is_unique)
        printf ("string is unique\n");
    else
        printf ("string is NOT unique\n");
}
0 голосов
/ 16 марта 2014
bool isUnique(char st[],int size)
{
    bool char_set[256]=false;
    for(int i=0;i<size;i++)
    {
        if(char_set[st[i]]-'0')
        return false;
        char_set[st[i]-'0')=true;
    }
    return true;
}
...