轉載請註明出處:
題目:
Write a method to decide if two strings are anagrams or not.
翻譯:
寫一個方法來判斷兩個字串是否互為變位詞。
註:如果構成兩個字串的字元完全相同,而對應字元所處的位置不同,則稱這兩個字串互為變位詞。如:"abbfcad"和"facbdab"互為變位詞。
思路:
很多人應該一下子就能想到對兩個字串按照在字典中出現的先後順序進行排序,而後再對排序後的兩個字串逐個比較,如果兩個字串相等,則二者互為變位詞,否則,不互為變位詞。
事實上,和Q1.1的思路一樣,我們同樣沒有必要對字串進行排序,我們同樣可以利用雜湊的思想(到現在為止,四個題目中已經有三個用到了雜湊的思想),開闢一個大小為26(假設字串中的字元為26個小寫字母)的int數組,初始值均為0,先對第一個字串進行映射,每個字元在該字串中出現一次,數組的對應位置的值就加1,而後再對第二個字串進行映射,每個字元在該字串中出現一次,數組中對應位置的值就減1,如果最後該數組的所有元素值均為0,則說明這兩個字串互為變位詞。該方法的時間複雜度為O(n)。
實現代碼:
/****************************題目描述:判斷兩個字串是否互為變位詞Date:2014-03-17****************************/#define MAX 26#include<iostream>#include<cstring>using namespace std;bool anagram(string s1,string s2){int len1 = s1.length();int len2 = s2.length();if(len1 != len2)return false;int i;int A[MAX];memset(A,0,sizeof(A));for(i=0;i<len1;i++){int index = s1[i] - 'a';A[index]++;}for(i=0;i<len1;i++){int index = s2[i] - 'a';A[index]--;}for(i=0;i<MAX;i++)if(A[i] > 0)return false;return true;}int main(){string s1 = "abbfcad";string s2 = "facbdab";if(anagram(s1,s2))cout<<"s1 and s2 are anagrams"<<endl;elsecout<<"s1 and s2 are not anagrams"<<endl;string s3 = "abbfcad";string s4 = "facbkab";if(anagram(s3,s4))cout<<"s3 and s4 are anagrams"<<endl;elsecout<<"s3 and s4 are not anagrams"<<endl;return 0;}
測試結果: