你的做法是行不通的,因爲會有很多衝突中的款項,即基本上是假定你是爲5 + 3 = 8,沒有其他組合會產生8,但你是錯誤的例子4 + 4也是8。
有很多特設的方法來解決這個問題,我將描述其中兩個。 您可以使用質數來解決問題,方法與您的方法類似,或者只需分配2個數組並保留字符記錄。
1.可以初始化2大小27的整數陣列,每個陣列說list1的[27]和list2中[27]初始化爲0時,由字符閱讀兩個字符串字符說,如果你從串1讀「C」,增加list1的第三個元素,因爲'c'是第三個字符等,當你完成讀取字符串時掃描兩個數組中的不匹配,如果有任何不匹配,它們不是彼此的排列。
一種可能的實施方式可以是
char str1[50]="permutation";
char str2[50]="importunate";
int list1[27]={0},list2[27]={0};
for(int i=0;i<11;i++){
list1[(int)str1[i]-(int)'a'+1]++;
list2[(int)str2[i]-(int)'a'+1]++;
}
for(int i=0;i<=27;i++){
if(i==27){
return true;
}
if(list1[i]!=list2[i])
{
return false;
}
}
此方法可以容易地擴展到考慮空間,不同的情況下,字符和數字。
2.這種方法類似於你做了什麼,但使用的ASCII值,它使用質數和,而不是另外它採用乘法.Problem用你的方法是可能的衝突很多的,如果你作爲dystroy指出選擇乘法而不是你會再次面對同樣的問題,但如果不乘以ascii值,我們乘以分配給特定字符的素數。
這裏我們首先分配一個數組,它存儲了從2開始的前26個素數,並且逐個字符地讀取字符串並乘以所有分配給字符串的每個字符的相應素數,最後我們比較兩個大整數,if這些都相等,則該字符串的相互
排列一個可能的實現可能是
int arr[27]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103};
char str1[50]="permutation";
char str2[50]="importunate";
int prd1=1,prd2=1;
for(int i=0;i<11;i++){
prd1=prd1*arr[(int)str1[i]-(int)'a'];
prd2=prd2*arr[(int)str2[i]-(int)'a'];
}
if(prd1==prd2)
return true;
else
return false;
這種方法並不像第一個要擴展的,因爲數字做大與字符串的長度, 我們可以
prd1=prd1*arr[(int)str1[i]-(int)'a']%1000000009;
prd2=prd2*arr[(int)str2[i]-(int)'a']%1000000009;//or some other large prime number
取而代之還有其他方法。您可以按字典順序對字符串進行排序,並按字符進行比較。其他方法是找到兩個字符串的每個字符的頻率,然後比較它們。 –