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