245
技術社區[雲棲]
CareerCup之1.4判斷字符串是否為變位詞
【題目】
原文:
1.4 Write a method to decide if two strings are anagrams or not.
譯文:
寫一個函數判斷兩個字符串是否是變位詞。
【分析】
變位詞(anagrams)指的是組成兩個單詞的字符相同,但位置不同的單詞。比如說, abbcd和abcdb就是一對變位詞。該題目有兩種思路:
【思路一】
由於變位詞隻是字母的順序改變,字符長度,字符種類沒有改變,所以根據此我們隻要重新根據字典序排序一下,兩個字符串也就一樣了。
The eyes(眼睛)——They see.(它們看得見。)這是一對變位詞。
根據字典序排序他們都會變成:eeehtsy
時間複雜度為:O(nlogn)
【思路二】
由於組成變位詞的字符是一模一樣的, 因此我們可以先統計每個字符串中各個字符出現的次數, 然後看這兩個字符串中各字符出現次數是否一樣。如果是,則它們是一對變位詞。 這需要開一個輔助數組來保存各字符的出現次數。我們可以開一個大小是256的整數數組, 遍曆第一個字符串時,將相應字符出現的次數加1;遍曆第二個字符串時, 將相應字符出現的次數減1。最後如果數組中256個數都為0,說明兩個字符串是一對變位詞。 (第1個字符串中出現的字符都被第2個字符串出現的字符抵消了), 如果數組中有一個不為0,說明它們不是一對變位詞。
【代碼一】
/********************************* * 日期:2014-05-06 * 作者:SJF0115 * 題目: 判斷字符串是否為變位詞 * 來源:CareerCup **********************************/ #include <iostream> #include <algorithm> #include <string.h> using namespace std; //判斷字符串是否為變位詞 bool IsAnagrams(string str1,string str2){ if(str1 == "" || str2 == ""){ return false; } int len1 = str1.length(); int len2 = str2.length(); //變位詞長度一樣 if(len1 != len2){ return false; } //排序 sort(&str1[0],&str1[0]+len1); sort(&str2[0],&str2[0]+len2); if(str1 == str2){ return true; } else{ return false; } } int main(){ char str1[] = "the eyes"; char str2[] = "they see"; bool result = IsAnagrams(str1,str2); cout<<result<<endl; return 0; }
【代碼二】
//判斷字符串是否為變位詞 bool IsAnagrams(string str1,string str2){ int i; if(str1 == "" || str2 == ""){ return false; } int len1 = str1.length(); int len2 = str2.length(); //變位詞長度一樣 if(len1 != len2){ return false; } //初始化 int vis[256]; memset(vis,0,sizeof(vis)); //遍曆第一個字符串,將相應字符出現的次數加1 //遍曆第二個字符串,將相應字符出現的次數減1 for(i = 0;i < len1;i++){ vis[str1[i]] ++; vis[str2[i]] --; } //判斷是否為變位詞 如果數組中256個數都為0,說明兩個字符串是一對變位詞。 for(i = 0;i < 256;i++){ if(vis[i] != 0){ return false; } } return true; }
最後更新:2017-04-03 12:56:33