2009-09-29 34 views
0

基本思想是對字符串進行排序並比較字符串的簽名,其中籤名是按字母順序排序的字符串。編寫一個方法來排序兩個不同字符串的字符,並對這些字符串的數組進行排序?

會是什麼有效的算法來做到這一點?

+0

你可以嘗試澄清你的問題一點? anagrams與什麼有關?你想排序不同的字符串還是排序組成一個字符串的字符? – 2009-09-29 03:36:25

+0

我必須1.對兩個不同字符串的字符進行不同的排序,並將其排序爲2.我對這些字符串進行排序和排列。 – Rachel 2009-09-29 03:43:07

回答

2

如果按「按字母順序排序」UTF8字符,則可以將它們轉換爲32位整數(UTF8字符爲1到4個8位值),然後執行RADIX sort。它將在O(N)時間內工作。如果您只使用ASCII,我會建議Counting Sort

有許多匹配簽名的方法,但我會使用Hash Table(平均O(1))或O(Lg N)結構,例如Red-Black TreesSkip-Lists

爲了進一步加快字符串匹配,您可以通過Run Length Encoding這些UTF8字符壓縮這些簽名(因爲它們已排序,簽名將爲運行+間隙)。實際上,您可以壓縮它們以使用代表7位字符(最常見),RLE運行和更長文字(8位到32位字符)的位標記。比較壓縮的字符串會更快。

0

你不指定編程語言或字符串的語言(是ASCII,Latin1的,UTF8,UTF16等),但基本上你比較功能將需要或者人物中的每個字符串,然後進行排序基於比較返回結果或者求和每個字符串中字符的序數值並返回它們之間的整數比較結果。

+0

我要尋找的Java解決方案和串的語言是UTF8 – Rachel 2009-09-29 03:40:22

0

問題類似於one asked here,對此我的回答是:

#define NUM_ALPHABETS 256 
int alphabets[NUM_ALPHABETS]; 

bool isAnagram(char *src, char *dest) { 
    len1 = strlen(src); 
    len2 = strlen(dest); 
    if (len1 != len2) 
     return false; 

    memset(alphabets, 0, sizeof(alphabets)); 
    for (i = 0; i < len1; i++) 
     alphabets[src[i]]++; 
    for (i = 0; i < len2; i++) { 
     alphabets[dest[i]]--; 
     if (alphabets[dest[i]] < 0) 
      return false; 
    } 

    return true; 
} 
+0

這是使用計數兩次排序的巧妙方法(第二時間遞減)。它對ASCII很好,但對於UTF8(字符集可以有8,16,24或32位字符)不太好。不過,就像我說過的一個有趣的例子,重新調整Counting Sort來找到anagrams。 – Adisak 2009-10-03 19:47:47