2009-02-26 131 views
6

我必須實現一個函數,它接受一個字符串作爲輸入,並從這個字符串中找到非重複字符。如何刪除字符串中的重複字符?

因此,一個例子是,如果我通過字符串str =「DHCD」將返回「DHC」 或STR2 =「KLKLHHMO」將返回「KLHMO」

+1

標題名稱錯誤 - 您想從字符串中刪除重複的字符。 – 2009-02-26 01:47:11

+0

你可以發佈你迄今爲止嘗試過的嗎? – SquareCog 2009-02-26 01:47:13

+0

LINQ解決方案應該很有趣。 – 2009-02-26 01:51:21

回答

24

一個LINQ方法:

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

它會做的工作

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; 
} 

我應該注意這是一個刑事效率低下的問題。

我覺得我第一次修改時神經過敏。

+1

上午我猜對了,你故意把這種低效率作爲練習留給讀者,還是你想讓這個工作更快的建議? – SquareCog 2009-02-26 01:49:20

+0

事實上,你是對的,如果它是家庭作業,那麼OP可以過濾並創建一個不可怕的東西。它也可以作爲了解正在發生的事情的基準。我不需要改進建議,謝謝。 – 2009-02-26 01:56:48

6

對於字節大小的字符(不適用於寬字符或其他編碼)的​​任意長度的字符串,我會使用查找表,每個字符一位(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; 
} 

我對C#不太好,所以我不知道使用位域而不是字節數組的正確方法。

如果你知道你的字符串會很短,那麼其他方法會提供更好的內存使用和/或速度。

+0

我認爲這會比Quintin Robinson的方法快得多,但會爲短字符串使用更多的內存。 – Sparr 2009-02-26 01:54:39

+0

但是,如果使用位數組,則中等或長度字符串的內存會顯着減少。 – Sparr 2009-02-26 03:03:45

3

這聽起來像是對我的功課,所以我只是要在高層次上描述。

  • 遍歷字符串,檢查每個字符
  • 檢查,如果你已經
    • 中看到的字符,如果你有,從字符串
    • 如果你還沒有將其刪除,請注意你已經看到這個字符
0

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; 

}

0
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; 
} 

希望這有助於

1

我在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); 
    } 
-1

在C#第一個答案的修訂版低於

串oldstr = 「abacab」;

string newstr = new string(oldstr.Distinct()。ToArray());

1

//這是在C#中,驗證冷落爲了簡潔 //原始的解決方案,從給定的字符串

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; 
    } 
0
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); 
3
void removeDuplicate() 
    { 
     string value1 = RemoveDuplicateChars("Devarajan"); 
    } 

    static string RemoveDuplicateChars(string key) 
    { 

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

您可以使用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); 
    } 
0

//刪除上下兩個副本

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; 
    } 
-1
var input1 = Console.ReadLine().ToLower().ToCharArray(); 
var input2 = input1; 
var WithoutDuplicate = input1.Union(input2); 
0
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()); 
     } 
    } 
0
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); 
0

我喜歡昆廷·羅賓遜的答案,只應該有像刪除列表一些改進,因爲它不是在這種情況下necessarry。 此外,在我看來,大寫字母(「K」)和小寫字母(「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; 
    } 
0

不知道如何優化,它是:

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

下面是從一個字符串中刪除重複的字符代碼

 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();