Как удалить повторяющиеся символы в строке?

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

Итак, пример: если я передаю строку str = "DHCD", он вернет "DHC" или str2 = "KLKLHHMO" он вернет "KLHMO"

Ответ 1

Подход Linq:

public static string RemoveDuplicates(string input)
{
    return new string(input.ToCharArray().Distinct().ToArray());
}

Ответ 2

Он выполнит работу

string removedupes(string s)
{
    string newString = string.Empty;
    List<char> found = new List<char>();
    foreach(char c in s)
    {
       if(found.Contains(c))
          continue;

       newString+=c.ToString();
       found.Add(c);
    }
    return newString;
}

Я должен отметить, что это преступно неэффективно.

Я думаю, что я был в бреду в первой ревизии.

Ответ 3

Для произвольных строк длины символов размера байта (не для широких символов или других кодировок) я бы использовал таблицу поиска, по одному биту на символ (32 байта для 256-битной таблицы). Прокрутите строку, только выходные символы, которые не имеют своих битов, затем включите бит для этого символа.

string removedupes(string s)
{
    string t;
    byte[] found = new byte[256];
    foreach(char c in s)
    {
        if(!found[c]) {
            t.Append(c);
            found[c]=1;
        }
    }
    return t;
}

Я плохо разбираюсь в С#, поэтому я не знаю, как правильно использовать битовое поле вместо массива байтов.

Если вы знаете, что ваши строки будут очень короткими, тогда другие подходы будут лучше использовать память и/или скорость.

Ответ 4

    void removeDuplicate()
    {
      string value1 = RemoveDuplicateChars("Devarajan");
    }

     static string RemoveDuplicateChars(string key)
    {
        string result = "";          
        foreach (char value in key)
            if (result.IndexOf(value) == -1)                   
                result += value;
        return result;
    }

Ответ 5

Это звучит как домашнее задание для меня, поэтому я просто опишу на высоком уровне.

  • Прокрутите строку, исследуя каждый символ
  • Проверьте, видели ли вы персонажа раньше
    • если у вас есть, удалите его из строки
    • Если вы этого не сделали, обратите внимание, что вы уже видели этот символ

Ответ 6

Мой ответ на языке Java.
Проводятся здесь, чтобы вы могли получить представление, даже если он находится на языке Java. Алгоритм останется таким же.

public String removeDup(String s)
  {
    if(s==null) return null;
    int l = s.length();
    //if length is less than 2 return string
    if(l<2)return s;
    char arr[] = s.toCharArray();

    for(int i=0;i<l;i++)
    {
      int j =i+1; //index to check with ith index
      int t = i+1; //index of first repetative char.

      while(j<l)
      {
        if(arr[j]==arr[i])
        {
          j++;

        }
        else
        {
          arr[t]=arr[j];
          t++;
          j++;
        }

      }
      l=t;
    }

    return new String(arr,0,l);
  }

Ответ 7

//это в С#, валидация оставлена ​​для краткости // примитивное решение для удаления повторяющихся символов из заданной строки

    public static char[] RemoveDup(string s)
    {
        char[] c = new char[s.Length];
        int unique = 0;
        c[unique] = s[0];  // Assume: First char is trivial
        for (int i = 1; i < s.Length; i++)
        {
            if (s[i-1] != s[i]
        c[++unique] = s[i];
        }
        return c;
    }

Ответ 8

вы можете использовать HashSet:

 static void Main()
    {
        string textWithDuplicates = "aaabbcccggg";

        Console.WriteLine(textWithDuplicates.Count());  
        var letters = new HashSet<char>(textWithDuplicates);
        Console.WriteLine(letters.Count());

        foreach (char c in letters) Console.Write(c);   
    }

Ответ 9

char * remove_duplicates (char * str) {    char * str1, * str2;

if(!str)
    return str;

str1 = str2 = str;

while(*str2)            
{   
    if(strchr(str, *str2)<str2)
    {
        str2++;
        continue;
    }

    *str1++ = *str2++;      
}
*str1 = '\0';

return  str;

}

Ответ 10

char* removeDups(const char* str)
{
 char* new_str = (char*)malloc(256*sizeof(char));
 int i,j,current_pos = 0,len_of_new_str;
 new_str[0]='\0';

 for(i=0;i<strlen(str);i++)
{
 len_of_new_str = strlen(new_str);
for(j=0;j<len_of_new_str && new_str[j]!=str[i];j++)
   ;
  if(j==len_of_new_str)
   {
     new_str[len_of_new_str] = str[i];
     new_str[len_of_new_str+1] = '\0';
   }
}
  return new_str;
}

Надеюсь, что это поможет

Ответ 11

String str="AABBCANCDE";  
String newStr=""; 
for( int i=0; i<str.length(); i++)
{
 if(!newStr.contains(str.charAt(i)+""))
 newStr= newStr+str.charAt(i);
 }
 System.out.println(newStr);

Ответ 12

//Удалите оба верхних нижних дубликата

public static string RemoveDuplicates(string key)
    {
        string Result = string.Empty;
        foreach (char a in key)
        {
            if (Result.Contains(a.ToString().ToUpper()) || Result.Contains(a.ToString().ToLower()))
                continue;
            Result += a.ToString();
        }
        return Result;
    }

Ответ 13

 class Program
    {
        static void Main(string[] args)
        {
            bool[] doesExists = new bool[256];
            String st = Console.ReadLine();
            StringBuilder sb = new StringBuilder();
            foreach (char ch in st)
            {
                if (!doesExists[ch])
                {
                    sb.Append(ch);
                    doesExists[ch] = true;
                }
            }
            Console.WriteLine(sb.ToString());
        }
    }

Ответ 14

Console.WriteLine("Enter String");

string str = Console.ReadLine();

string result = "";
result += str[0]; // first character of string

for (int i = 1; i < str.Length; i++)
{
    if (str[i - 1] != str[i])
        result += str[i];
}

Console.WriteLine(result);

Ответ 15

Мне нравится ответ Квинтин Робинсон, только должны быть некоторые улучшения, такие как удаление списка, потому что в этом случае это не обязательно. Кроме того, на мой взгляд, Uppercase char ( "K" ) и строчный char ( "k" ) - это одно и то же, поэтому их следует считать одним.

Итак, вот как я это сделаю:

private static string RemoveDuplicates(string textEntered)
    {

        string newString = string.Empty;

        foreach (var c in textEntered)
        {
            if (newString.Contains(char.ToLower(c)) || newString.Contains(char.ToUpper(c)))
            {
                continue;
            }
            newString += c.ToString();
        }
        return newString;
    }

Ответ 16

Не уверен, насколько это оптимально:

public static string RemoveDuplicates(string input)
{
    var output = string.Join("", input.ToHashSet());
    return output;
}

Ответ 17

Ниже приведен код для удаления повторяющихся символов из строки

        var input = "SaaSingeshe";
        var filteredString = new StringBuilder();
        foreach(char c in input)
        {
            if(filteredString.ToString().IndexOf(c)==-1)
            {
                filteredString.Append(c);
            }
        }
        Console.WriteLine(filteredString);
        Console.ReadKey();

Ответ 18

  Демонстрация пространства имен {class Program {

  static void Main(string[] args) {
     string myStr = "kkllmmnnouo";
     Console.WriteLine("Initial String: "+myStr);
    // var unique = new HashSet<char>(myStr);
     HashSet<char> unique = new HashSet<char>(myStr);
     Console.Write("New String after removing duplicates: ");

     foreach (char c in unique) 
        Console.Write(c);   
  }    } }

Ответ 19

пересмотренная версия первого ответа на С# ниже

string oldstr = "abacab";

string newstr = новая строка (oldstr.Distinct(). ToArray());

Ответ 20

var input1 = Console.ReadLine().ToLower().ToCharArray();
var input2 = input1;
var WithoutDuplicate = input1.Union(input2);